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

2016-02-19 16:40 66 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按钮。

  (图一)

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

  (图二)

  第一部分单选按钮选项是要创建的服务器类型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对象向导的属性对话框(图五)。

  (图五)

  在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 

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

  不管你想不相信,到目前为止,我们用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工程,单击对话框中的命令按钮,你会看到输出的结果。(如图九)

  (图九)

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

  下面再让我们用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窗口中,你应该能看到输出的结果。

本文示例代码或素材下载

来源:http://www.tulaoshi.com/n/20160219/1612746.html

延伸阅读
AJAX(Asynchronous JavaScript And XML)是一种运用JavaScript和可扩展标记语言(XML),在网络浏览器和服务器之间传送或接受数据的技术。主要应用于Ria(Rich internet applications)的开发上。 xml问题终于在今天还是解决了。最后在FireFox里还是使用了Dom的一些老方法。我这里就具体解释一下方法吧. 代码: var XmlHttp; //用来...
标签: PHP
  php具有极其强大的图像处理能力,用它可以很轻易的动态生成web图像。   一下是一个使用php做成的一个简单计数器。   1. 总体思路:   把以往的访问人数记录在一个文本文件中,当网页被访问的时候,从打开该文件   并从中读出以往的访问人数,加 1,得到最新的访问人数,并把该数目格式化成&nb...
  一: 概述  本文旨在介绍如何使用开放源软件Procmail和Qpopper来配置一台可供大量用户使用的POP3服务器,重点在于如何保持最佳的服务器性能。  二: 步骤  软件环境为RedHat Linux 7.1  1. 下载最新版的Procmail和Qpopper  Procmail 最新版本现在是3.21 可从 http://www.procmail.org/procmail-3.21.tar.gz...
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 ...
  时下拥有两台以上台式机的家庭已经为数不少,退役下来的老机器食之无味,弃之可惜。其实你完全可以利用它作为一台局域网服务器,在晚饭后呼朋喝友,喊上邻居,拉几条网线,搬上笔记本电脑一起对战CS和帝国时代,或者利用代理服务器共享上网。跟我来一起动手,搭建一个简单的Linux局域网服务器吧。 A.准备 Linux系统对服务器的要...

经验教程

462

收藏

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