初識ICE,試着使用slice語言在vs2010下編寫HelloWorld程序,參考了官網http://www.zeroc.com/index.html及網絡帖子上的思路,終成。現在記錄一下。
1.在官網上下載最新版本的ice開發包http://www.zeroc.com/download.html,最新爲Ice-3.4.2.msi和Ice-3.4.2-ThirdParty.msi。下載後解壓到我本地E盤ICE文件夾下。
2.在IDE中設置項目需要包含的目錄,vs設置全局目錄的方式不同與之前版本。設置方法是:
在IDE中,打開視圖-》屬性管理器。展開任意一個項目的樹形後,有一個名爲“Microsoft.Cpp.Win32.user”的項目(如下圖)。這個就是全局目錄了。將ICE的bin目錄添加進可執行文件目錄,include添加進包含目錄,lib添加進庫目錄
3 將slice2cpp作爲外部工具添加到vs2010.
具體步驟:在IDE的工具-》外部工具-》添加 中,設置如下圖
4 創建名爲Printer的slice文件,用記事本編寫即可,注意文件保存爲.ice後綴形式。Printer.ice的內容如下:
module Demo
{
interface Printer
{
void printString(string s);
};
};
5創建名爲HelloWorld的空白解決方案。
在新建項目->其他項目類型->visual studio解決方案。
6在空白解決方案中添加名爲Ice的空白靜態庫項目。
將Printer.ice放置到Ice項目文件夾下,然後在Ice項目的資源文件中添加現有項Printer.ice.然後執行slice2cpp工具命令。
此時Ice項目文件夾下已增加了Printer.h和Printer.cpp文件,將它們分別添加到源文件和頭文件的文件夾中,這裏還需要將源文件中的#include<Printer.h>改爲#include"Printer.h"
生成項目,通過!
7添加一個名爲Client的win32控制檯應用程序的空白項目。
在屬性頁配置屬性->鏈接器->輸入->附加依賴項加加入iced.lib和iceutild.lib
在屬性頁的通用屬性->框架和應用中添加新應用選擇Ice,爲項目的源文件文件夾下添加名爲Client.cpp的源文件。內容爲:
#include <Ice/Ice.h>
#include "../Ice/Printer.h"
using namespace std;
using namespace Demo;
int main(int argc, char * argv[])
{
int status = 0;
Ice::CommunicatorPtr ic;
try
{
ic = Ice::initialize(argc, argv);
Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
PrinterPrx printer = PrinterPrx::checkedCast(base);
if (!printer) throw "Invalid proxy";
printer->printString("Hello World!");
} catch (const Ice::Exception & ex)
{
cerr << ex << endl;
status = 1;
} catch (const char * msg)
{
cerr << msg << endl;
status = 1;
}
if (ic) ic->destroy();
return status;
}
編譯,通過!
3建立名爲Server的空白win32控制檯程序。
在屬性頁配置屬性->鏈接器->輸入->附加依賴項加加入iced.lib和iceutild.lib
在屬性頁的通用屬性->框架和應用中添加新應用選擇Ice,爲項目的源文件文件夾下添加名爲Server.cpp的源文件。內容爲:
#include "../Ice/Printer.h"
#include <Ice/Application.h>
#include <Ice/Ice.h>
using namespace std;
using namespace Demo;
class PrinterI : public Printer
{
public:
virtual void printString(const string& s,const Ice::Current&);
};
void PrinterI::printString(const string& s, const Ice::Current&)
{
cout << s << endl;
}
int main(int argc, char* argv[])
{
int status = 0;
Ice::CommunicatorPtr ic;
try
{
ic = Ice::initialize(argc, argv);
Ice::ObjectAdapterPtr adapter= ic->createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");
Ice::ObjectPtr object = new PrinterI;
adapter->add(object,ic->stringToIdentity("SimplePrinter"));
adapter->activate();
ic->waitForShutdown();
} catch (const Ice::Exception& e)
{
cerr << e << endl;
status = 1;
} catch (const char* msg)
{
cerr << msg << endl;
status = 1;
}
if (ic)
{
try
{
ic->destroy();
} catch (const Ice::Exception& e)
{
cerr << e << endl;
status = 1;
}
}
return status;
}
編譯,通過。
4在項目文件夾下的debug目錄下先運行Server.exe,再運行Client.exe。
運行是提示少3個dll文件ice34d.dll、iceutil34d.dll、和bzip2d.dll,從ICE目錄下找到並複製過去,注意要複製對應vs2010的vc100目錄下的dll文件。
先運行Server.exe,再運行Client.exe,在Server端出現了HelloWorld,成功!