学习ATL开发笔记 — Windows Live

来源:百度文库 编辑:神马文学网 时间:2024/04/29 21:32:10

开发ATL,离不开GUID生成工具,微软提供了两种生成GUID的方式,一种在命令行模式下运行:uuidgen命令,另外一种是在命令行模式下运行使用guidgen工具,这个工具生成多种方式,又专门针对ATL中的DEFINE_GUID来生成的选项,点击NewGuid后,复制粘贴就完成ATL的GUID的设置工作。非常的爽!~

在使用VS2005开发c++中,调用系统自带的头文件时,要用 #include<**.h>,包含自己定义的头文件时,要使用#include”**.h”的形式。否则在编译时就会提示出错。

2009-05-02 今天在实践ATL开发指南第一个示例,所有的代码都按照书上写的录入上去了,但是在编译时却一直有个方法被提示“找不到标识符”。原来的代码是这样写的:

STDMETHODIMP Math::Factorial(short op1,long *result){*result=CalcFactorial(op1);return S_OK;}long CalcFactorial(short n){if(n<=1)return 1;return n*CalcFactorial(n-1);}

我开始以为写错了方法名,自己又逐字的对照确认无误后,在Google上搜索了一下,发现原来代码顺序错了。要把CalFactorial这个方法写到Factorial上面,这样才不会出错。因为c++使用的是静态类型检查,在编译时就检查函数是否被正确的使用,这样所有使用到的变量和函数都要先声明,后调用。写惯了Asp.net,C#,对于方法放置位置从没有关心过,遇见了严谨的c++时,就出现了错误了。解决办法:

在Factorial上面加上一个声明 long CalcFactorial(short n) ;就可以了。或者把这个方法移动Factorial方法之前。

不使用默认的ATL项目模板建立Com组件的步骤:

1、定义全局的GUID,引入InitGuid.h文件,通过DEFINE_GUID来设定组件的Guid。

2、建立接口,并是每一个暴露的接口都继承IUnknown。定义纯虚函数,最好使用STDMETHOD宏来定义纯虚函数,这个宏通过windows.h头文件引入。C++中要求所有继承这个接口的对象必须实现这些纯虚函数时,可以这样定义 virtual long Add(long op1,long op2)=0;或者使用STDMETHOD(Add)(long,long,long*) PURE; PURE宏其实就是 "=0”。

3、实现定义的接口,并且要实现IUnknown中的QueryInterface,AddRef,Release三个方法。

4、实现类工厂,就是继承与IClassFactory接口的类。类工厂是为了简化com创建方法,屏蔽被其他语言使用的差异。IClassFactory也是继承于IUnknown,IClassFactory增加了CreateInstance和LockServer方法,CreateInstance就是用来创建com对象的,并返回该对象的所有接口。LockServer不是很理解,看实现不是很麻烦。MSDN上好像的意思是对象是否存活在内存中,也就是被缓存了,如果被缓存了,则引用加一,否则就减一。等引用为零时就释放这个dll。

5、创建组件的宿主,实现DllGetClassObject和DllCanUnloadNow两个方法

6、添加注册表和组件类别的支持

7、添加Def文件导出DllGetClassObject、DllCanUnloadNow、DllRegisterServer、DllUnregisterServer四个函数。

8、把项目属性的 常规->配置类型 改成动态链接库 一个基本的com组件就完成了。