您的位置:首页 > 其它

VS2003配置和编写第一个ICE程序

2007-07-29 02:32 357 查看
经过痛苦的三天奋斗,终于成功见到了“HELLO,WORLD!”,鉴于网上的文章基本每篇都有BUG,致使我们落入陷阱,浪费大好时间,所以把我的所有步骤和示例代码一一描述,但愿后来者能少走弯路。

以下步骤没多做解释是因为本人也是初学,尚未入门

一、下载
Ice-3.2.0-VC71.msi: http://www.zeroc.com/download/Ice/3.2/Ice-3.2.0-VC71.msi
Ice-3.2.0-ThirdParty-VC71.msi: http://www.zeroc.com/download/Ice/3.2/Ice-3.2.0-ThirdParty-VC71.msi

二、安装
1、Ice-3.2.0-VC71.msi 安装到c:/Ice-3.2.0-VC71
2、Ice-3.2.0-ThirdParty-VC71.msi到C:/Ice-3.2.0-VC71/ThirdParty
3、在OS系统环境变量中添加ICEROOT,指向c:/Ice-3.2.0-VC71
4、在OS系统环境变量path添加“%ICEROOT%/bin;”、“%ICEROOT%/lib;”、“%ICEROOT%/ThirdParty/bin;”、“%ICEROOT%/ThirdParty/lib”;

二、设置
1、打开VS2003,
“工具”/“选项”/“项目”/“VC++目录”
选择“可执行文件”: 增加“$(ICEROOT)/ThirdParty/bin”、“$(ICEROOT)/bin”
选择“包含文件”: 增加“$(ICEROOT)/include”、“$(ICEROOT)/ThirdParty/include”
选择“库文件”: 增加“$(ICEROOT)/ThirdParty/lib”、“$(ICEROOT)/lib”
三、示例程序
1、新建ICEDEMO空白解决方案
2、在方案中添加新建Visual C++项目Slice,选择Win32静态库空白项目。
3、命令行中敲入notepad Printer.ice(必须是.ice),
4、文件printer.ice内容如下:
注意分号:
module demo
{
interface Printer
{
void printString(string s);
};
};
保存在目录/slice下。
5、用命令行程序编译printer.ice:slice2cpp printer.ice,生成Printer.h、Printer.cpp两个文件
6、将pritner.h、printer.cpp加入Slice工程
注意: 7、修改Printer.cpp中的第一行“#include <printer.h>”为“#include "printer.h"”
8、设置Slice项目属性还需要进行如下设置:
C/C++选项卡/代码生成/运行时库/“多线程调试DLL(/MDd)”;
C/C++选项卡/语言/启用运行时类型信息/“是(/GR)”;
注意:MD表示RELEASE,MDD表示DEBUG
9、新建一个Visual C++项目Server,选择Win32控制台空白项目
10、在项目server中添加引用项目Slice
11、在项目server中添加空白CPP文件Server.cpp:
#include "../Slice/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->add(object,ICE::stringToIdentity("SimplePrinter"));您就死翘翘了
//就这个问题缠了我3天,后来发现官方文档是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;
}
12、项目属性设置:
C/C++/代码生成/运行时库/“多线程调试DLL(/MDd)”;
链接器/输入/附加依赖项/“Iced.lib IceUtild.lib”;
13、添加新建Visual C++项目Client,选择Win32控制台空白项目
14、在项目Client中添加引用项目Slice
15、在项目Client中添加空白CPP文件client.cpp:
#include <Ice/Ice.h>
#include "../Slice/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;
}
16、项目属性设置:
C/C++/代码生成/运行时库/“多线程调试DLL(/MDd)”;
链接器/输入/附加依赖项/“Iced.lib IceUtild.lib”;
17、编译、连接
18、先运行server.exe,然后运行client.exe,client.exe一晃而过,然后server.exe打印出hello world。
19、路漫漫其修远兮,good luck
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: