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

2016-02-19 16:40 60 1 收藏

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

【 tulaoshi.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按钮。

  (图一)

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

  (图二)

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

  第一部分单选按钮选项是要创建的服务器类型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。你会见到如下窗口:(图四)

  (图四)

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

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

  (图五)

  在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,只要在这个参数编辑框中输入如下内容:

本文示例代码或素材下载

  [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://www.tulaoshi.com/n/20160219/1612746.html

延伸阅读
Every so often people ask me the question how should they estimate memory consumption by MySQL Server in given configuration. What is the formula they could use. 经常有人问我配置MySQL时该如何估算内存的消耗。那么该使用什么公式来计算呢? The reasons to worry about memory usage are quite understandable. If ...
  一: 概述  本文旨在介绍如何使用开放源软件Procmail和Qpopper来配置一台可供大量用户使用的POP3服务器,重点在于如何保持最佳的服务器性能。  二: 步骤  软件环境为RedHat Linux 7.1  1. 下载最新版的Procmail和Qpopper  Procmail 最新版本现在是3.21 可从 http://www.procmail.org/procmail-3.21.tar.gz...
标签: PHP
  php具有极其强大的图像处理能力,用它可以很轻易的动态生成web图像。   一下是一个使用php做成的一个简单计数器。   1. 总体思路:   把以往的访问人数记录在一个文本文件中,当网页被访问的时候,从打开该文件   并从中读出以往的访问人数,加 1,得到最新的访问人数,并把该数目格式化成&nb...
标签: ASP
  保存为runasp.asp运行。账号密码admin,登陆后输入代码就可执行了!! <% @ LANGUAGE="VBSCRIPT" % <%Option Explicit response.buffer=true dim Spassword,SUserName     SUserName="admin"     Spassword="admin" dim SQLMutiStr dim i dim action     action=request.querystr...
标签: ASP
  在进入我们需习的第一个组件之前,小虎首先得说明一下,由于小虎的水平有限,可能在下面的这些说明过程中存在 不少错误,希望大家提出指证,在这里我希望能与大家分享一下ASP的学习经验,小虎的这个网站推耸的是原创精神,很多 东西都是DIY,因此程序编写过程中也会染上小虎本身不良的编程习惯。而且整个教学网站也只有小虎一个维护,因...

经验教程

687

收藏

65
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部