`
zhaohaolin
  • 浏览: 984217 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用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:\samples\Simple_ATL”,然后单击OK按钮。
(图一)
你会看到一个选择屏幕(图二)。
(图二)
第一部分单选按钮选项是要创建的服务器类型 “Server Type”。因为我们要创建一个进程内服务器(Server DLL),所以应该选择的类型是动态链接库“Dynamic Link Library——DLL”,注意所有进程内服务器都是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 
  不管你想不相信,到目前为止,我们用ATL所创建的COM服务器已经完全能运行!当然,还需要编译它才行。按下“F7”功能键,几秒钟之后,VC++便会完成编译并注册你所创建的DLL服务器。这样其它的应用程序就可以使用这个COM服务器了。试一试吧!

第五步:用VB测试这个服务器
   为了用VB来测试COM服务器,首先你必须安装VB的开发环境。(如果你没有安装VB或不想用VB测试,可以跳过这一步到下一步:用VC++测试COM服 务器。)首先启动VB,选择创建标准EXE“Standard EXE”工程。在对话框中放一个按钮。然后我们要引用COM服务器。单击“Project”菜单并选择“References”。然后下翻页直到可以看见 “Simple ATL 1.0 Type Library”(如图八),然后选中它。
(图八)
单击OK按钮。现在双击前面在对话框中创建的命令按钮,VB将会带你到这个按钮的代码窗口。然后添加以下代码:
Private Sub Command1_Click()
Dim objTestATL As SIMPLE_ATLLib.First_ATL
Set objTestATL = New First_ATL

Dim lngReturnValue As Long

objTestATL.AddNumbers 5, 7, lngReturnValue

MsgBox "The value of 5 + 7 is: " & lngReturnValue

Set objTestATL = Nothing
End 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_ATL\Simple_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;

// 初始化COM
hr = 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;
}
}
// 释放COM
CoUninitialize();
}

第七步:编译并运行测试程序
   按下“F5”功能键,编译测试程序,然后按“Control+F5”功能组合键运行测试程序。在DOS窗口中,你应该能看到输出的结果。
分享到:
评论

相关推荐

    《使用ATL编写一个简单的COM服务器》配套源代码

    《网上《使用ATL编写一个简单的COM服务器》一文配套源代码

    COM编程精彩实例+光盘(源代码)

    这是一本学习COM的入门教程,虽然书是2001年左右的,比较旧了,...第七章 使用ATL编写COM服务器 第八章 使用VB和VJ++编写COM服务器 第九章 COM通信 第十章 COM+实例 第十一章 访问数据库对象 第十二章 其他例子

    com_server.rar_COM server_com server_comserver

    这是一个非常简单的COM服务器,它不需要MFC和ATL的支持。 // 这个DLL COM服务器提供了一个接口:ImyInterface,其中有两个方法:Square 和 Cube。 // 它是使用纯粹C++编写的一个最简单的服务器,没有串转换、宏处理...

    VC++编写COM组件教程

    本教程的目的是告诉你如何使用ATL创建一个COM服务器,并使用Visual C++和Visual Basic程序来分别调用这个服务器。以及编写复杂的com组件

    Visual C++实践与提高-COM和COM+篇『PDF』

    11.5.2 创建一个简单的COM组件——例程MTSServ 11.5.3 MTS Explorer 11.5.4 将Account组件添加到MTS环境中 11.5.5 运行并监控Account组件 11.6 微软消息队列(MSMQ) 11.6.1 何谓MSMQ 11.6.2 MSMQ的好处 11.6.3 MSMQ...

    64位proe5.0 异步开发 VS2008 ATL进程外com发布 ProEngineerStart

    64位proe5.0 异步开发 平台VS2008 编写测试ProEngineerStart,ProEngineeerEnd函数,通过ATL进程外com发布,然后用MFC.exe调用本地服务器com接口!

    COM编程入门篇.doc

    因此,对于一个程序员来说,不仅要掌握使用COM的方法,而且还要彻底熟悉COM的所有一切。 本文由浅入深描述COM的内在运行机制,教你如何使用第三方提供的COM对象(以Windows 外壳组件Shell为例)。读完本文后,你就...

    《用纯粹的C++编写COM组件》配套VC源代码

    本文提供一个完全用C++实现的进程内(DLL)COM服务器,不要ATL或MFC提供任何支持。用这种方式编写COM对象可以让你深入地洞察到COM处理进程内服务器的方法以及COM是如何创建类工厂的。利用本文提供的这个简单框架你...

    COM c++技术资料

    解释COM服务器内幕以及如何用C++编写自己的接口。继上一篇COM编程入门之后,本文将讨论有关COM服务器的内容,解释编写自己的COM接口和COM服务器所需要

    vc++ 应用源码包_1

    非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是...

    vc++ 应用源码包_6

    非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是...

    vc++ 应用源码包_2

    非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是...

    vc++ 应用源码包_5

    非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是...

    vc++ 应用源码包_3

    非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是...

    vc++ 开发实例源码包

    另外有只打开一个应用程序、CRichEdit的使用、最小到托盘、自动检测在线用户(多播组)等。 FreeBird2011Dlg.h 主对话框类头文件 MultiGroup.h 多播组类头文件 UserLink.h 用户链表类头文件 ListenSocket.h 侦听接口...

    分析BT种子文件的COM插件

    vc2010 atl编写的asp com控件 可以比较全面的分析种子文件,可以用来转换bt种子为磁力链接 使用例子 '创建服务器对象 Set tp = Server.CreateObject("Bdecode.MyTorrent") '打开种子文件 tp.OpenTorrent...

    ActiveX多文件上传插件

    新颖网络上传插件(StorageWebPlug)是一个支持超大文件(2GB,可扩展)上传的COM控件, 具备断点续传,文件MD5验证,大大提高上传效率、节省带宽,有详细的上传进度显示,支持多种脚本语言,欢迎下载体验。免费提供...

    Visual.C#.编程精彩百例

    实例11 一个有趣栈类的实现 实例12 垃圾收集器管理与应用 实例13 垃圾收集器算法控制与使用 实例14 调用栈记录异常点 实例15 使用C#异常的栈跟踪 实例16 运行期间检测变量类型 实例17 常用值类型的原型定义 ...

    WORD电子签名插件V1.2

    这是我学习ATL的成果,学习过程及程序的编写,前前后后共用了一个多月的时间,花了不少的心血。其间遇到了不少困难,终于都一一解决了。这要感谢www.csdn.net上的热心朋友,从他们的BLOG文章中,我获得了不少灵感...

    MFC Windows程序设计(第2版修订版)--源代码

    MFC不是类似活动模板库(ATL)的通用COM框架,但是MFC使编写某些COM程序更容易,使编写ActiveX控件的过程更简单,而且它使编写自动化(Automation)服务器程序(使用COM技术来供脚本客户调用的程序)变成了二件轻而易举的...

Global site tag (gtag.js) - Google Analytics