- 浏览: 2035497 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
使用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 "stdafx.h"
#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窗口中,你应该能看到输出的结果。
评论
#include "..\Simple_ATL\Simple_ATL.h"
应改为
#include "..\Simple_ATL\Simple_ATL_i.h"
我
我环境是VS2010
#include "..\Simple_ATL\Simple_ATL.h"
应改为
#include "..\Simple_ATL\Simple_ATL_i.h"
我
总算是又一次复习了个人的ATL小程序。
再一次踏上了ATL的征途。希望这一次可以征服。。。
发表评论
-
如何使用BHO定制你的Internet Explorer浏览器
2009-08-20 11:26 2165如何使用BHO定制你的In ... -
定制IE浏览器的尖兵利器 - BHO
2009-08-19 18:28 2865作者:peterzb(个人 ... -
用 ATL ActiveX 绘制任意平面函数的曲线
2009-08-19 18:23 1650用 ATL ActiveX 绘制任意 ... -
COM多线程原理与应用
2009-08-19 18:14 2700COM多线程原理与应用 目录: COM多线程原 ... -
com技术简介
2009-07-28 11:32 2729一、COM是一个更好的C++1、COM 是什么Don Box ... -
COM高手总结的八个经验和教训之一
2009-07-28 11:31 1790在日常工作中,我看到 ... -
COM高手总结的八个经验和教训之二
2009-07-28 11:31 2019STA 线程需要消息循环 ... -
COM基础知识
2009-07-28 11:30 1917(1) COM组件实际上是一个C++类,而接口都是纯虚类。 ... -
COM原理及应用----概述
2009-07-28 11:29 18581、组件设计的原始目的 跨平台、跨网络、积木式搭建程序 2、组 ... -
COM原理及应用----COM对象和接口
2009-07-28 11:29 44231、COM对象的理解 ... -
COM原理与应用----COM的实现
2009-07-28 11:28 29681、COM的实现与操作系 ... -
COM原理及应用----COM特性
2009-07-28 11:28 21021、面向对象系统的三个最基本的特性 封装性、多态性 ... -
COM原理及应用----用Visual C++开发COM应用
2009-07-28 11:27 36501、MFC和ATL 对于COM应用的开发来说,建 ... -
COM原理及应用----可连接对象
2009-07-28 11:26 23541、COM的高级特性 COM规范中有一些高 ... -
COM原理及应用---- 结构化存储
2009-07-28 11:25 24481、结构化存储 ... -
COM原理及应用----命名和绑定技术
2009-07-28 11:25 32911、COM对象的创建方法 客户程序可以通过 ... -
COM原理及应用----统一数据传输
2009-07-28 11:24 24611、概述 COM提供了应用之间数据交换的标 ... -
COM原理及应用----分布式COM(DCOM)
2009-07-28 11:24 30911、DCOM COM的 ... -
COM原理及应用----自动化(Automation)对象
2009-07-28 11:23 23031、自动化技术 自动化技术既以前提到的OL ... -
COM原理及应用----ActiveX控件
2009-07-28 11:22 41151、ActiveX控制 ActiveX控制 ...
相关推荐
* ATL 提供了一个简单的方式来创建 COM 组件,简化了开发过程。 * ATL 支持多种开发语言,例如 Visual C++、Visual Basic 等。 * ATL 提供了丰富的功能,例如支持多线程、聚合和安全性等。 COM 的应用领域: * ...
ATL开发入门及实例解析主要涵盖了如何利用ATL进行COM组件的创建、理解和实现。 在ATL中,开发者可以利用模板类和宏来构建COM对象,这些模板类和宏已经封装了COM的核心功能,如接口实现、事件处理和对象生命周期管理...
ATL编写Windows服务能够使程序更加轻量级且高效。 本主题聚焦于如何使用ATL来创建Windows服务,虽然描述中提到这是一个入门级程序,但理解基础概念和流程对进一步深入学习非常重要。以下是一些关键知识点: 1. **...
5. **类工厂(Class Factory)**:COM组件实例化由类工厂负责,它是创建组件对象的关键组件。 6. **延迟绑定与早期绑定**:理解这两种绑定方式的区别,延迟绑定允许在运行时解析接口,而早期绑定则在编译时完成,...
通过阅读这本电子书,你将对COM有一个全面的认识,了解如何在C++环境中利用COM技术开发组件,从而提升软件的可复用性和可维护性。无论是初学者还是有经验的开发者,都能从中受益匪浅,为你的编程事业奠定坚实的基础...
ATL 写第一个组件"则涉及到了实际的编程实践,ATL(Active Template Library)是微软提供的一个用于快速开发COM组件的库,通过实例教学,学习者可以了解到如何使用ATL创建简单的COM组件,并理解其工作原理。...
- **SimpleObject**:一种简单的 ATL 对象模板。 - **线程模型**:决定对象如何处理多线程访问。Apartment 模型适用于 GUI 应用。 - **接口类型**:Dual 表示支持本地和远程调用,提高灵活性。 - **聚合**:一种...
不过,要注意的是,虽然COM提供了强大的组件模型,但编写COM对象和接口并非本文的重点。学习COM编程通常涉及以下步骤: 1. 定义接口:声明接口的类型库(IDL,Interface Definition Language)。 2. 实现接口:在C++...
COM(Component Object Model)是一种微软提出的技术,用于创建可重用的软件组件,而ATL(Active Template Library)是微软为简化COM组件的开发而设计的C++库。学习COM和ATL对于Windows平台下的软件开发,特别是组件...
在C++中,还可以利用 ATL(Active Template Library)库来简化COM编程,ATL提供了一系列宏和模板,可以自动生成大部分COM组件的基础设施代码,使得开发过程更加高效。 对于本实例来说,你将学习如何使用C++创建一个...
本教程将带你入门如何使用VB6、C++或VC6在Windows XP、Win2003、Win2K环境下,借助Visual Studio 6或VS.NET进行COM/ATL DLL的编写。 首先,理解COM的基本概念至关重要。COM是基于接口的,每个COM对象都提供一组预...
5. VC++中的COM开发:利用MFC或ATL框架创建和管理COM组件。 6. 应用场景:如ActiveX、自动化服务器和OLE等。 通过深入学习杨老师的COM入门教程,你将能够熟练掌握这些基础知识,并能够创建和应用自己的COM组件,为...
4. **理解线程模型**:COM组件支持多种线程模型,如单线程公寓(STA)、多线程公寓(MTA)和自由线程(Free)。理解这些模型对于构建健壮的多线程应用程序至关重要。 5. **事件处理和接口继承**:学习如何通过...
1. **COM组件**:COM组件是可重用的二进制模块,它可以是DLL或EXE文件,实现了特定接口并遵循COM规范。这些组件可以跨进程甚至跨计算机边界进行通信,提高了软件开发的效率和灵活性。 2. **接口**:在COM中,接口...
在"COM WebService实例入门"中,你将学习如何在VC++ 6.0中创建一个简单的COM组件,并在Visual Studio 2005中编写一个基础的WebService,然后将两者结合,使COM组件能够调用WebService的方法。这个过程中,你将深入...
COM对象可以用C++编写,并利用MFC或ATL等库简化开发过程。即使你不熟悉MFC或ATL,也可以直接使用C++进行开发。 #### 五、COM与动态链接库(DLL) 在Windows环境中,DLL是非常重要的组成部分,它们提供了模块化编程...
它引入了服务组件(Enterprise Services),这些组件可以自动利用COM+提供的服务,例如,无需程序员手动编写代码,就能实现事务管理和安全性。 学习COM,你需要掌握以下几个关键知识点: 1. **接口(Interface)**...
"COM编程入门" COM 编程是 Windows 操作系统中的一种重要技术,它提供了一种跨应用和语言共享二进制代码的方法。COM 的全称是 Component Object Model,即组件对象模型。它的出现解决了源代码重用的问题,提供了一...
COM(Component Object Model)是微软提出的一种组件对象模型,它是一种二进制标准,用于创建可重用的软件组件。...在学习过程中,结合实践编写组件,理解其内部工作机制,将有助于提升你的编程能力。