上篇写了C#如何使用ICE,这篇介绍如何在C++中使用ICE
因为VC++6.0使用ICE需要安装STLPort,麻烦。所以这里服务端和客户端都使用VS.NET 2005开发,语言采用VC++,
1,安装ice,这里安装在D:\Lib\Ice-3.3.0
2,编写DemoIce.ice文件
#ifndef DEMO_ICE
#define
DEMO_ICE
module Demo
{
interface
DemoIce
{
idempotent
void
SetEx(
string
strMsg);
//
,
[
"
cpp:const
"
] idempotent
void
GetEx(
out
string
strMsg);
}
;
}
;
//
end module
#endif
3.编译DemoIce.ice成DemoIce.cpp文件
path D:\Lib\Ice-3.3.0\bin
slice2cpp.exe DemoIce.ice
成功后会生成DemoIce.h DemoIce.cpp二个文件
4,打开.net2005 新建--项目--其他语言--VC++--空项目 名称DemoS;
5,解决方案窗口库,右键--添加--现有项 把刚才生成的DemoIce.h DemoIce.cpp二个文件加到项目里
6,解决方案窗口库,右键--添加--新建项 添加一个C++文件 名称DemoS 代码如下
#include
<
stdio.h
>
#include
<
Ice
/
Ice.h
>
#include
<
DemoIce.h
>
using
namespace
Demo;
using
namespace
std;
#pragma comment(lib,
"
Iced.lib
"
)
#pragma comment(lib,
"
IceUtild.lib
"
)
//
release 版本用Ice.lib IceUtil.lib
class
DemoIceI :
public
Demo::DemoIce
{
public
:
string
strMsg;
virtual
void
SetEx(
const
::std::
string
&
param,
const
::Ice::Current
&
)
{
strMsg
=
param;
printf(param.c_str());
}
virtual
void
GetEx(::std::
string
&
param,
const
::Ice::Current
&
)
const
{
param
=
"
1234\n
"
;
}
}
;
int
main()
{
int
status
=
0
;
Ice::CommunicatorPtr ic;
try
{
ic
=
Ice::initialize();
Ice::ObjectAdapterPtr adapter
=
ic
->
createObjectAdapterWithEndpoints(
"
DemoIceEndpoint
"
,
"
default -p 10000
"
);
Demo::DemoIcePtr demoIcePtr
=
new
DemoIceI();
adapter
->
add(demoIcePtr, ic
->
stringToIdentity(
"
DemoIce
"
));
adapter
->
activate();
printf(
"
server.start ok \n
"
);
ic
->
waitForShutdown();
}
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;
}
7.工具--选项--项目和解决方案--VC++目录 在下拉框选择“包含文件” 添加D:\Lib\Ice-3.3.0\include,
8.继续添加包含文件,把DemoIce.h所在的目录也包含进去,我这里是E:\Workspace\VC++\Test\IceVC8\DemoIce
9.在下拉框选择“库文件” 添加 D:\Lib\Ice-3.3.0\lib
10.项目--属性--配置属性--c/c++--代码生成--运行时库--多线程调试 DLL ; 编译运行 如果没问题,服务端完成。
11,打开.net2005 新建--项目--其他语言--VC++--空项目 名称DemoC;
12.解决方案窗口库,右键--添加--新建项 添加一个C++文件 名称DemoC 代码如下:
#include
<
stdio.h
>
#include
<
DemoIce.h
>
#include
<
Ice
/
Ice.h
>
using
namespace
Demo;
using
namespace
std;
#pragma comment(lib,
"
Iced.lib
"
)
#pragma comment(lib,
"
IceUtild.lib
"
)
//
release 版本用Ice.lib IceUtil.lib
int
main()
{
int
status
=
0
;
Ice::CommunicatorPtr ic;
try
{
ic
=
Ice::initialize();
Ice::ObjectPrx
base
=
ic
->
stringToProxy(
"
DemoIce:default -h 127.0.0.1 -p 10000
"
);
DemoIcePrx twoway
=
DemoIcePrx::checkedCast(
base
);
twoway
->
SetEx(
"
abcd\n
"
);
string
strMsg;
twoway
->
GetEx(strMsg);
printf(strMsg.c_str());
}
catch
(
const
Ice::Exception
&
ex)
{
cerr
<<
ex
<<
endl;
status
=
1
;
}
catch
(
const
char
*
msg)
{
cerr
<<
msg
<<
endl;
status
=
1
;
}
printf(
"
client.start ok \n
"
);
getchar();
if
(ic)
{
ic
->
destroy();
}
return
status;
}
13.编译运行 如果没问题会得到服务器端的数据 1234