用ICE编写helloworld程序(VS2008,C++)

时间:2022-03-11 09:16:11

因工作需要学习了ICE,先将简单的一个计算加法和减法的小程序和大家分享一下:(程序写的很傻很傻)

 (1)安装和配置ICE

 首先下载ICE安装包,我下载的是http://www.zeroc.com/download.html,Ice-3.4.2.msi

    安装完毕后,配置环境变量,(我的电脑右键->属性->高级->环境变量,将你的安装目录加入如:C:/Programs file/Zeroc/Ice-3.4.2/bin)。

设置完后,打开cmd,输入slice2cpp看看是不是有命令提示,如果有说明正确,如果没有次命令可能是环境变量配置错误,仔细检查一下。

(2)打开VS2008,建立新工程Server,新增.ice文件。(如果此时还没有的话,选择Tools->Add-in Manger,选中Ice-3.4.2 visual studio add-in 和visual Assiant X。)编写Caculator.ice

module MCal
{
    interface Cal
    {
        int add(int num1,int num2);
        int sub(int num1,int num2);  
    };
};

(3)编译Caculator.ice会生成Caculator.h 和Cacultor.cpp两个文件。

编译方法一:打开cmd,输入slice2cpp Caculator.ice的路径 ,如slice2cpp D:\TestIce\TestIce\Caculator.ice。或许在你建立的工程中找不到这两个文件,搜寻一下,看看在哪,然后将这两个文件放在Caculator.ice的目录下。

编译方法二:用vs2008编译,编译前需要进行下设置。选择Tools->External Tools,Add如下:

用ICE编写helloworld程序(VS2008,C++)

然后设置Caculator的属性,Custom Build Step->General,设置如下:

用ICE编写helloworld程序(VS2008,C++)

那么就可以编译Caculator.ice文件啦。

(4)编译译成功后,建立服务器端CaculatorServer.cpp,type.h

CaculatorServer.cpp:

#include<Ice/Ice.h>
#include<Ice/Application.h>
#include<iostream>

#include"type.h"
using namespace std;

CalI::CalI()
{
   num1d=0;
   num2d=0;
}
CalI::~CalI()
{

}
int CalI::add(int num1, int num2, const Ice::Current &)
{
    int sumv=0;
    sumv=num1+num2;
    return sumv;
}
int CalI::sub(int num1,int num2,const Ice::Current&)
{
 int difv=0;
 if (num1>num2)
 {
     difv=num1-num2;
     return difv;
 }
 else
 {
    cout<<"there is some wrong!"<<endl;
    return 0;
 }
}

class CalApp:virtual public Ice::Application
{
public:
    virtual int run(int,char *[]);
};

int CalApp::run(int,char *[])
{
    //shutdownOnInterrupt();
    Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapterWithEndpoints(
        "Caladapter","default -p 10000");
    Ice::ObjectPtr object = new CalI();
    adapter->add(object,communicator()->stringToIdentity("Cal"));
    adapter->activate();
    communicator()->waitForShutdown();

    if(interrupted())
        cerr << appName() << ":recv signal,shutting down" << endl;

    return 0;
}
int main(int argc,char* argv[])
{
    CalApp app;
    return app.main(argc,argv);
}

type.h

#ifndef _TYPE_H
#define _TYPE_H
using namespace std;
using namespace MCal;
class CalI:public Cal
{
public:
    CalI();
    ~CalI();
    virtual int add(int num1,int num2,const Ice::Current&);
    virtual int sub(int num1,int num2,const Ice::Current&);
private:
    int num1d;
    int num2d;
};

#endif 

编译成功,如果有很多错误,可能是没有加入库文件iced.lib和iceutild.lib

如果成功,服务器端建立成功。

(4)重新建立工程,Client,建立客户端CalculatorClient.cpp

将生成的Calculator.h 和Calculator.cpp加入Client工程中,然后建立CalculatorClient.cpp

#include <Ice/Ice.h>
#include <Ice/Application.h>
#include "Calculator.h"
#include<iostream>

using namespace std;
using namespace MCal;

//#define RC_List "/home/tester/Key_Checking/ATT_RC/RMT_B109P_EU_Set.txt"
//#define RC_Data "/home/tester/Key_Checking/ATT_RC/RMT_B109P_EU_Set.dat"

class MyApp : virtual public Ice::Application
{
public:
    virtual int run(int,char*[]);
};

int MyApp::run(int,char*[])
{
    Ice::ObjectPrx base = communicator()->stringToProxy("Cal:default -p 10000");
    CalPrx calculator = CalPrx::checkedCast(base);
    if(!calculator)
        throw "Invalid proxy!";
        cout<<calculator->add(1,2)<<endl;
       
        cout<<calculator->sub(56,12)<<endl;
   
   
    //Calc->Close();
    return 0;
}

int main(int argc,char* argv[])
{
    MyApp app;

    return app.main(argc,argv);
}