Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16498491
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:32:08

下载本文示例代码
  理解最简单的COM客户  要理解COM的最直接方法是通过一个客户应用来考察它。COM编程的目的是为了让客户应用可以得到有用的对象。一旦你理解了客户,要理解服务端就变得非常的简单。相反,同时直接考察服务端和客户端是容易令人迷惑的;如果你首先学习其细节的话,就更加复杂了。因此,我们首先由最简单的定义开始:COM客户是一个使用COM来调用一个COM服务器上的方法的程序。这种客户/服务关系的一个最简单直接的例子是一个用户界面应用(客户)调用另一个应用(服务端)的方法。如果该用户界面应用使用COM来调用这些方法,那么根据定义,这个用户界面应用就是一个COM客户。  我们不断强调以上的内容是有理由的,因为COM服务器和客户的分别可以是更为复杂的。许多时候,应用客户也将是一个COM服务端,而应用的服务器也可是一个COM客户。一个应用同时是COM客户和服务器是很常见的。在这一章中,我们将让这个区别最简单化,涉及的只是一个纯COM客户。  客户端连接的4个步骤  客户使用COM与一个服务器通信时,通常要经过4个基本的步骤。当然,现实中的客户端做的事情更多,不过即使它非常复杂,其核心也是这4个步骤。在这部分中我们将以最低级的方式介绍COM--使用简单的C 调用。  以下是我们将要进行的4个步骤:  1、初始化COM子系统,并且在完成时关闭它;  2、经一个服务器的特有接口查询COM  3、执行接口上的方法  4、释放该接口  为了简单,我们将使用一个极为简单的COM服务器。我们已经假定服务器已经写了出来,并且有使用说明。  该服务器拥有一个称为IBeep的接口。该接口只有一个方法,称为Beep。Beep接收一个参数:持续时间。以下我们将写一个最简单的COM客户来连接该服务器,并且调用Beep的方法。  以下就是实现这4个步骤的C 代码。这是一个真正可以工作的COM客户应用。 #include "..\BeepServer\BeepServer.h"// GUIDS defined in the serverconst IID IID_IBeepObj ={0x89547ECD,0x36F1,0x11D2,{0x85,0xDA,0xD7,0x43,0xB2,0x32,0x69,0x28}};const CLSID CLSID_BeepObj = {0x89547ECE,0x36F1,0x11D2,{0x85,0xDA,0xD7,0x43,0xB2,0x32,0x69,0x28}};int main(int argc, char* argv[]){HRESULT hr; // COM error codeIBeepObj *IBeep; // pointer to interfacehr = CoInitialize(0); // initialize COMif (SUCCEEDED(hr)) // macro to check for success{hr = CoCreateInstance( CLSID_BeepObj, // COM class idNULL, // outer unknownCLSCTX_INPROC_SERVER, // server INFOIID_IBeepObj, // interface id(void**)&IBeep ); // pointer to interfaceif (SUCCEEDED(hr)){// call methodhr = IBeep->Beep(800); // release interfacehr = IBeep->Release(); }}// close COMCoUninitialize(); return 0;}  在编译服务器时,头部的“BeepServer.h”会被创建。BeepServer是一个进程内的COM服务器,我们将在下一节再详细讨论。在编译该服务器时,开发工具包还会自动产生几个头文件。这个特别的头文件定义了接口IBeepObj。编译服务器还会在该程序的顶部产生GUID。我们将它从服务器工程的顶部拷贝了过来。  以下我们将详细讨论这4个步骤。共2页。 1 2 :   理解最简单的COM客户  要理解COM的最直接方法是通过一个客户应用来考察它。COM编程的目的是为了让客户应用可以得到有用的对象。一旦你理解了客户,要理解服务端就变得非常的简单。相反,同时直接考察服务端和客户端是容易令人迷惑的;如果你首先学习其细节的话,就更加复杂了。因此,我们首先由最简单的定义开始:COM客户是一个使用COM来调用一个COM服务器上的方法的程序。这种客户/服务关系的一个最简单直接的例子是一个用户界面应用(客户)调用另一个应用(服务端)的方法。如果该用户界面应用使用COM来调用这些方法,那么根据定义,这个用户界面应用就是一个COM客户。  我们不断强调以上的内容是有理由的,因为COM服务器和客户的分别可以是更为复杂的。许多时候,应用客户也将是一个COM服务端,而应用的服务器也可是一个COM客户。一个应用同时是COM客户和服务器是很常见的。在这一章中,我们将让这个区别最简单化,涉及的只是一个纯COM客户。  客户端连接的4个步骤  客户使用COM与一个服务器通信时,通常要经过4个基本的步骤。当然,现实中的客户端做的事情更多,不过即使它非常复杂,其核心也是这4个步骤。在这部分中我们将以最低级的方式介绍COM--使用简单的C 调用。  以下是我们将要进行的4个步骤:  1、初始化COM子系统,并且在完成时关闭它;  2、经一个服务器的特有接口查询COM  3、执行接口上的方法  4、释放该接口  为了简单,我们将使用一个极为简单的COM服务器。我们已经假定服务器已经写了出来,并且有使用说明。  该服务器拥有一个称为IBeep的接口。该接口只有一个方法,称为Beep。Beep接收一个参数:持续时间。以下我们将写一个最简单的COM客户来连接该服务器,并且调用Beep的方法。  以下就是实现这4个步骤的C 代码。这是一个真正可以工作的COM客户应用。 #include "..\BeepServer\BeepServer.h"// GUIDS defined in the serverconst IID IID_IBeepObj ={0x89547ECD,0x36F1,0x11D2,{0x85,0xDA,0xD7,0x43,0xB2,0x32,0x69,0x28}};const CLSID CLSID_BeepObj = {0x89547ECE,0x36F1,0x11D2,{0x85,0xDA,0xD7,0x43,0xB2,0x32,0x69,0x28}};int main(int argc, char* argv[]){HRESULT hr; // COM error codeIBeepObj *IBeep; // pointer to interfacehr = CoInitialize(0); // initialize COMif (SUCCEEDED(hr)) // macro to check for success{hr = CoCreateInstance( CLSID_BeepObj, // COM class idNULL, // outer unknownCLSCTX_INPROC_SERVER, // server INFOIID_IBeepObj, // interface id(void**)&IBeep ); // pointer to interfaceif (SUCCEEDED(hr)){// call methodhr = IBeep->Beep(800); // release interfacehr = IBeep->Release(); }}// close COMCoUninitialize(); return 0;}  在编译服务器时,头部的“BeepServer.h”会被创建。BeepServer是一个进程内的COM服务器,我们将在下一节再详细讨论。在编译该服务器时,开发工具包还会自动产生几个头文件。这个特别的头文件定义了接口IBeepObj。编译服务器还会在该程序的顶部产生GUID。我们将它从服务器工程的顶部拷贝了过来。  以下我们将详细讨论这4个步骤。共2页。 1 2 : 下载本文示例代码


DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二DCOM揭秘之二
阅读(193) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~