分享
 
 
 

C++ Builder 6 进行 SOAP 开发(1) -- 一个 Hello world! 的例子

王朝c/c++·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

C++ Builder 6

BizSnap/SOAP/WebService(1)

-- 一个 Hello world! 的例子

作为 Delphi 的兄弟, C++ Builder 在很多方面都跟 Delphi 是如出一辙,在 SOAP/WebService 方面当然也是大同小异了。关于用 Delphi 进行 SOAP/WebService 应用开发,本站曾经有多篇文章作了介绍,大虾李维也已经为此出版了一本专著,所以我也就不想再多说了。但因为前几天在论坛上看到有人在讨论李维的书和用 C++ Builder 做 SOAP/WebService 应用的问题,所以我照本站那几篇介绍 Delphi 做 SOAP/WebService 的文章也写几篇 C++ Builder 的文章。

所用平台:Borland C++ Builder 6 + Update1、Windows 2000 Server、IIS5

服务端:

1.New|WebServices|Soap Server Application ,如下图,与 Delphi 6 + Update 2 相比,除了左上角的图标以外,完全相同:

选 Web App Debugger executeable 类型, CoClass Name 为:wadSoapDemo1 ,如下图:

确定后将自动提示是否要新建一个接口,如下图,确定即可打开新建接口向导,如果要以后再增加接口,可以在 New|WebServices 中选择 SOAP Server Interface 同样可打开新建接口向导:

2.新建接口向导如下图,输入接口名:Hello 即可生成一个 SOAP 服务端接口:

如果选中 Generate sample methods 即可在生成的接口中同时生成一系列方法,比较全面地说明了如何在接口中定义方法,利用这个选项,可以很方便地学习 C++ Builder 6 的 SOAP 开发方法。 Service Activation Model 可以指定服务端的激活方式:Per Request(每次请求服务时激活)/Global(全局)。默认为 Per Request ,这种方式下,在客户端的每次服务请求时建立服务,响应结束后也结束服务;对于 Global 方式下,服务端只有一个服务实例,所有的客户端服务请求都由此实例处理,具体是通过一个叫 xxxFactory 的全局静态函数来实现的;

3.SaveAll , Unit1 命名为: MainWM , Project1 命名为: Demo1 , Hello 不改名;

4.在接口单元的头文件(Hello.h)中增加一个方法 -- GetHello ,如下:

__interface INTERFACE_UUID("{3C8C8426-1CF2-423D-B09E-5FEB5716B3C4}")

IHello : public IInvokable

{

public:

virtual AnsiString GetHello( int aID ) = 0; // 新增的方法

};

typedef DelphiInterface _di_IHello;

其中的 __interface 并不是新增的关键字(Borland 还不至于敢去擅改 C++ 的标准的^_^),它只是一个宏,其实也就是 class ,只不过更清楚地说明了这是一个接口,所谓接口就是要求用 __interface 定义的类必须是完全抽象类(所有的成员函数都必须是纯虚函数);所以我们新增的方法 GetHello 就是一个纯虚函数。

5.实现 GetHello 函数,下面是在接口单元文件(Hello.cpp)中生成的类定义和我们加入的方法及其实现:

class THelloImpl : public TInvokableClass, public IHello

{

public:

AnsiString GetHello( int aID ); // 这是新增方法的定义

/* IUnknown */

HRESULT STDMETHODCALLTYPE QueryInterface(const GUID& IID, void **Obj)

{ return GetInterface(IID, Obj) ? S_OK : E_NOINTERFACE; }

ULONG STDMETHODCALLTYPE AddRef() { return TInterfacedObject::_AddRef(); }

ULONG STDMETHODCALLTYPE Release(){ return TInterfacedObject::_Release(); }

/* Ensures that the class is not abstract */

void checkValid() { delete new THelloImpl(); }

};

AnsiString THelloImpl::GetHello( int aID )

{

if ( aID == 1 )

return "Hello";

else

return "world";

}

正如其中的注释说明的那样,在这个类里还实现了 IUnknown 接口,并且通过一个 checkValid() 函数来保证这个类实现了接口中定义的所有纯虚函数。其中的 GetHello 就是我们新增的接口方法,包括它的一个非常简单的实现。

6.下面这段自动生成的代码是用于注册接口及其实现类的,因为 C++ 中没有像 Delphi 那样的 Initialization ,所以用的是编译指令 #pragma startup 来实现:

static void RegTypes()

{

InvRegistry()->RegisterInterface(__interfaceTypeinfo(IHello));

InvRegistry()->RegisterInvokableClass(__classid(THelloImpl));

}

#pragma startup RegTypes 32

7.编译之即可产生: Demo1.exe ;

先运行一次 Demo1.exe ,完成注册的工作后启动 Web App Debugger 。打开浏览器, 输入 URL 为: http://localhost:1024/Demo1.wadSoapDemo1 即可看到一个标准的 SOAP 应用说明页面,点击进入相应链接即可看到相关的 WSDL 。

客户端程序:

1.New|Application 新建一个一般 VCL 应用程序;

2.SaveAll , Unit1 命名为 ClnMain , Project1 命名为 Client ;

3.New|Web Services|Web Services Importer :

在下图中的URL中输入: http://localhost:1024/Demo1.wadSoapDemo1/wsdl/IHello,

如果上面用浏览器可以看到正确的 XML 文档的话,选择“Next”后将产生导入的结果,如下图:

其中有我们在服务端定义的接口 IHello 及其方法 GetHello ,选择完成即可生成接口单元;

4.SaveAll, IHello 单元不改名保存,再在 ClnMain 中 #include IHello.h ;

5.在 Form 上放上一个 LabeledEdit 和一个 Button 两个控件即可,如下图:

6.双击 Button1 输入下面的程序:

void __fastcall TForm2::Button1Click(TObject *Sender)

{

LabeledEdit1->EditLabel->Caption

= GetIHello()->GetHello( StrToInt( LabeledEdit1->Text ) );

}

7.编译运行,在 Edit 中输入"1"按 Button1 , Label 中将显示"Hello",输入其它数字将显示"world";

就这样,完成了一个用 C++ Builder 实现的 SOAP 应用,是不是跟 Delphi 没什么不同?

[Mental Studio]猛禽 Apr.30-02

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有