使用ATL编写一个简单的COM服务器

wcl131057

wcl131057

2016-02-19 16:40

下面是个超简单的使用ATL编写一个简单的COM服务器教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

  本文的对象是COM编程初学者,其目的旨在描述如何用ATL创建COM服务器,以及如何在VC或VB编写的客户端应用程序中调用COM服务器。为了不给初学者增加负担,本文不打算深入讨论COM和IDL的细节,而是展示用ATL创建简单的COM对象所需要的步骤。希望通过这篇文章能刺激你学习COM编程的欲望。

  第一步:运行ATL COM向导(参见图一)

  你要做的第一件事情是启动VC创建一个新的工程。选择ATL COM AppWizard。注意这个向导创建的工程并没有包含任何初始的COM对象,在完成这个向导之后,要从ClassView中用New ATL Object命令来指定你想要增加到这个工程中的对象类型。

  在Project name编辑框中为工程取个名字:Simple_ATL。在Location编辑框中指定工程的存放位置,如E:samplesSimple_ATL,然后单击OK按钮。

  (图一)

  你会看到一个选择屏幕(图二)。

  (图二)

  第一部分单选按钮选项是要创建的服务器类型Server Type。因为我们要创建一个进程内服务器(Server DLL),所以应该选择的类型是动态链接库Dynamic Link LibraryDLL,注意所有进程内服务器都是DLL。下面是三个复选框不用去管它,它和我们创建的这个工程没关系。单击Finish按钮。向导将自动产生相应的文件。然后出现New Project Information窗口告诉你向导将要创建一些什么文件(图三)。确认后单击OK按钮。

  (图三)

  第二步:创建新的ATL对象

  确定在VC的IDE环境中见到Workspace View。也就是工作间视图。你也可以进入View菜单,然后选择Workspace。这个视图中由三个标签,单击ClassView标签。你会看到其中的Simple_ATL Classes。选中后单击右键并从弹出菜单中选择New ATL Object。你会见到如下窗口:(图四)

  (图四)

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  我们就用缺省选择(Simple Object),也就是简单对象。单击Next按钮进入ATL Object Wizard Properties,也就是ATL对象向导的属性对话框(图五)。

  (图五)

  在Short Name文本编辑框中输入First_ATL。注意向导会自动填写其余的文本编辑框。单击Attributes标签。其中有几组单选按钮选项和几个复选框。第一组单选按钮是线程模型Threading Model,我们取缺省值Apartment Model。第二组单选按钮是接口Interface,单击Dual,也就是双接口。最后,第三组单选按钮是聚合Aggregation,因为我们不想涉及接口的聚合,所以在此选择No。至于底下的三个复选框,我们不用管它,单击OK按钮让向导创建新的ATL Simple Object

  第三步:添加方法

  如果你单击工作间的ClassView标签,你会注意到向导在里面添加了一些内容。添加一个方法很容易,(图六)选中IFirst_ATL后单击右键并选择Add Method。

  (图六)

  单击Add Method后,你会看到Add Method to Interface对话框(图七)。

  (图七)

  在Return Type编辑框中(已成灰色)这个方法的返回值已经缺省为 HRESULT。大多数情况下都应该是这个值类型。下一个编辑框是方法名Method Name,输入方法名AddNumbers。最后一个编辑框是要你输入希望使用的参数Parameters。由于我们打算将两个数字相加,然后返回相加结果,所以要使用三个参数。最后一个参数是一个指针。现在你不用去关心繁杂的接口定义语言IDL,只要在这个参数编辑框中输入如下内容:

本文示例代码或素材下载

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  [in] long Num1, [in] long Num2, [out] long *ReturnVal

  它的意思是声明两个long类型输入[in]参数和一个指针返回值[out](刚开始可能会不习惯这样怪怪的写法,但等你阅读了一两本关于COM的书之后,会慢慢接收它的)。单击OK按钮。展开所有ClassView的节点+号。从这个视图可以清楚地了解Simple_ATL各个类之间的层次关系。双击最上面IFirst_ATL(接口)节点下的AddNumbers(方法)节点,右边屏幕将会显示这个方法的实现代码。添加如下的代码:

  

STDMETHODIMP CFirst_ATL::AddNumbers(long Num1, long Num2, long *ReturnVal){// TODO: Add your implementation code here*ReturnVal = Num1 + Num2;return S_OK;} 

  第四步:编译这个DLL 

  不管你想不相信,到目前为止,我们用ATL所创建的COM服务器已经完全能运行!当然,还需要编译它才行。按下F7功能键,几秒钟之后,VC++便会完成编译并注册你所创建的DLL服务器。这样其它的应用程序就可以使用这个COM服务器了。试一试吧!

  第五步:用VB测试这个服务器

  为了用VB来测试COM服务器,首先你必须安装VB的开发环境。(如果你没有安装VB或不想用VB测试,可以跳过这一步到下一步:用VC++测试COM服务器。)首先启动VB,选择创建标准EXEStandard EXE工程。在对话框中放一个按钮。然后我们要引用COM服务器。单击Project菜单并选择References。然后下翻页直到可以看见Simple ATL 1.0 Type Library(如图八),然后选中它。

  (图八)

  单击OK按钮。现在双击前面在对话框中创建的命令按钮,VB将会带你到这个按钮的代码窗口。然后添加以下代码:

  

Private Sub Command1_Click()Dim objTestATL As SIMPLE_ATLLib.First_ATLSet objTestATL = New First_ATLDim lngReturnValue As LongobjTestATL.AddNumbers 5, 7, lngReturnValueMsgBox "The value of 5 + 7 is: " & lngReturnValueSet objTestATL = NothingEnd Sub

  如果你是个VB程序员,这对你来说简直太容易了。声明变量和对象,调用COM服务器的AddNumbers方法,然后显示结果。按下F5功能键运行这个VB工程,单击对话框中的命令按钮,你会看到输出的结果。(如图九)

  (图九)

  下面再让我们用VC++测试这个COM服务器。

  第六步:用VC测试这个服务器

  保存并关闭Simple_ATL工程,然后创建一个新的Win32 控制台应用程序。选择Win32 Console Application并取名为Test_ATL。单击OK按钮并接受对话框中的缺省设置(空的工程)。单击Finish按钮,然后再按OK按钮。这样就创建好了一个空的工程。按下Control+N键向工程中添加一个文件。从弹出的窗口中选择C++ Source File并为它取名为Test_ATL.cpp。按下OK按钮。这样工程中就有了一个空的.CPP文件。我们要在这个文件中添加一些测试COM服务器的代码:

  

// 将头文件的目录指到Simple_ATL工程所在的目录#include "..Simple_ATLSimple_ATL.h"#include// 从Simple_ATL 工程所在目录的Simple_ATL_i.c 文件中拷贝以下内容// 注意: 你也可以不拷贝这些东西,而是把文件Simple_ATL_i.c包含进来。// 我之所以将它拷进来,是想更清楚地展示这些敞亮来自什么地方一击它们的代码const IID IID_IFirst_ATL = {0xC8F6E230,0x2672,0x11D3,{0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}};const CLSID CLSID_First_ATL = {0x970599E0,0x2673,0x11D3,{0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}};void main(void){// 声明HRESULT和Simple_ATL接口指针HRESULT hr;IFirst_ATL *IFirstATL = NULL;// 初始化COMhr = CoInitialize(0);// 使用SUCCEEDED 宏并检查我们是否能得到一个接口指针 if(SUCCEEDED(hr)){hr = CoCreateInstance( CLSID_First_ATL, NULL, CLSCTX_INPROC_SERVER,IID_IFirst_ATL, (void**) &IFirstATL);// 如果成功,则调用AddNumbers方法,否则显示相应的出错信息if(SUCCEEDED(hr)){long ReturnValue;IFirstATL-AddNumbers(5, 7, &ReturnValue);cout  "The answer for 5 + 7 is: "  ReturnValue  endl;IFirstATL-Release(); }else{cout  "CoCreateInstance Failed."  endl;}}// 释放COMCoUninitialize();}

  第七步:编译并运行测试程序

  按下F5功能键,编译测试程序,然后按Control+F5功能组合键运行测试程序。在DOS窗口中,你应该能看到输出的结果。

本文示例代码或素材下载

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

使用ATL编写一个简单的COM服务器

编程语言 网络编程
使用ATL编写一个简单的COM服务器

一个简单的XML 服务器

Web开发
一个简单的XML 服务器

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

制作一个简单的服务器端控制

ASP
制作一个简单的服务器端控制

ATL/COM简单工程

编程语言 网络编程
ATL/COM简单工程

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

一个实际的OLE服务器的开发

Delphi
一个实际的OLE服务器的开发

使用索引服务器- 使用索引服务器的对象

ASP
使用索引服务器- 使用索引服务器的对象

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

php分页类

php分页类

DLL(Dynamic Link Libraries)全面剖析(2)

DLL(Dynamic Link Libraries)全面剖析(2)
下拉加载更多内容 ↓