ATL基础操作手册
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ATL 基础操作手册
陈喜庆 QQ:31444465
ATL 基础操作手册
《手册》详细描述了 ATL 组件式开发的常用操作,系本人经验和心得的总结和完善。对 于想要了解或刚刚接触 ATL COM 的开发人员具有一定的参考价值。由于时间仓促和本人的经 验有限,疏漏之处在所难免,还望斧正。
在此,非常感谢顾学明和李策在工作和生活上对我的关心和指导。感谢赵宏辉反复细心 地阅读本《手册》,并提出了宝贵的修改意见和建议,他为该手册提供了强有力的技术支持。 感谢景翔和何学洲在平日的工作中给予我莫大的帮助。
methodIndex); [propget, helpstring("property MyProperty")] HRESULT MyProperty([out,
retval] BSTR *pVal); [propput, helpstring("property MyProperty")] HRESULT MyProperty([in] BSTR
删除成员变量
在 ClassView 视图中双击需要删除的成员变量,定位后删除该定义。
8
ATL 基础操作手册
陈喜庆 QQ:31444465
编辑接口成员 添加方法
1. 在 ClassView 视图中右键接口对象,单击“Add Method”;
2. 设置返回值类型、方法名和参数。操作过程中,系统将实时显示出即将生成的接口定义, 即“Implementation”里的内容。
if (Enabled == NULL) return E_POINTER;
return E_NOTIMPL; } 5. 切换至组件类头文件(Zoom.h),删除代码段中的实现体,并在定义最后加上分号,如 下所示: STDMETHOD(get_Enabled)(VARIANT_BOOL * Enabled); 6. 重复上面的步骤,完成 ICommand 接口中其它方法和属性的修改。
1. 在 ClassView 视图中右键组件类对象,单击“Add Method Variable”;
2. 填写成员变量的类型和名称,并设置相应的访问权限,点击“OK”。
7
ATL 基础操作手册
陈喜庆 QQ:31444465
删除成员函数
在 ClassView 视图中右键成员函数对象,单击“Delete”。
陈喜庆 QQ:31444465
设置编译环境
1. 设置 Unicode 字符集的调试环境为“Win32 Unicode Debug”;
2. 在 Project 菜单下,单击“Setting”命令。切换至 Debug 属性页,设置“Executable for debug session”项,选择希望调用组件的程序。
10
ATL 基础操作手册
陈喜庆 QQ:31444465
删除方法
1. 在 ClassView 视图中右键方法的实现对象,单击“Delete”;
11
ATL 基础操作手册
陈喜庆 QQ:31444465
2. 双击方法的定义对象,定位到接口定义文件(ATL_Common.idl)中的方法定义;
3. 删除该方法的定义(红色部分),如下所示: interface IZoom : IUnknown { [helpstring("method MyMethod")] HRESULT MyMethod(BSTR methodName,INT
2. 选择“ESRI SystemUI Object Library(1.0)”,单击“OK”;
3. 选择“ICommand”,单击“OK”。
14
ATL 基础操作手册
陈喜庆 QQ:31444465
修改预定义接口的定义和实现
1. 在 ClassView 视图中双击组件类对象,打开组件类头文件(Zoom.h); 2. 找到 ICommand 接口的定义代码段,如下所示:
retval] BSTR *pVal); [propput, helpstring("property MyProperty")] HRESULT MyProperty([in] BSTR
newVal); };
13
ATL 基础操作手册
预定义接口
陈喜庆 QQ:31444465
添加预定义接口
1. 在 ClassView 视图中右键组件类对象,单击“Implement Interface”;
创建 ATL 工程
1. 在 File 菜单下,单击“New”命令。在 Projects 属性页中选择“ATL COM AppWizard”, 并填写工程名称和路径;
2. 不做任何修改,单击“Finish”;
1
ATL 基础操作手册
陈喜庆 QQ:31444465
3. 核对工程信息,单击“OK”。
2
ATL 基础操作手册
4
ATL 基础操作手册
陈喜庆 QQ:31444465
添加工程的引用
1. 在 ATL 工程中,切换至“FileView”视图。双击“StdAfx.h”以打开工程的头文件;
2. 在“#include <atlcom.h>”语句后添加如下代码段,其中斜体部分为类库的引用,采 用“相对路径”方式,当然,具体类库的引用可根据实际需要进行调整。需要注意的是, 某些类库的引用是有顺序要求的。 #pragma warning(push) #pragma warning(disable : 4146) #pragma warning(disable : 4192)
#import "../Include/Com/esriSystem.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE") #import "../Include/Com/esriSystemUI.olb" raw_interfaces_only raw_native_types no_namespace named_guids #import "../Include/Com/esriGeometry.olb" raw_interfaces_only raw_native_types no_namespace named_guids #import "../Include/Com/esriDisplay.olb" raw_interfaces_only raw_native_types no_namespace named_guids #import "../Include/com/esriGeoDatabase.olb" raw_interfaces_only raw_native_types no_namespace named_guids #import "../Include/Com/esriCarto.olb" raw_interfaces_only raw_native_types no_namespace named_guids #import "../Include/Com/esriControls.olb" raw_interfaces_only raw_native_types no_namespace named_guids
#pragma warning(pop) 注:类库的引用可以采用“绝对路径”和“相对路径”两种方式。采用“相对路径”的 好处就是可以很方便地将整个工程移植到其它计算机上,而不需要再次更改类库的引用 路径。当然,事先需要将所引用的类库复制到该工程的指定目录下。
5
ATL 基础操作手册
编辑组件类成员
陈喜庆 QQ:31444465
STDMETHOD(get_Enabled)(VARIANT_BOOL * Enabled) {
if (Enabled == NULL) return E_POINTER;
return E_NOTIMPL; } 3. 切换至组件类实现文件(Zoom.cpp),并将头文件中的代码段复制过来; 4. 将复制过来的代码段稍作修改,修改之后如下所示: STDMETHODIMP CZoomIn::get_Enabled(VARIANT_BOOL * Enabled) {
创建 ATL 对象
1. 在 ClassView 视图中右键工程,单击“New ATL Object”;
2. 选择“Simple Object”;
3
ATL 基础操作手册
陈喜庆 QQ:31444465
3. 在 Names 属性页的 ShortName 中输入名称,前面不需要加“C”或“I”之类的前缀; 4. 在 Attributes 属性页中修改以下内容,点击“确定”。
9
ATL 基础操作手册
陈喜庆 QQ:31444465
3. 双击刚刚创建的方法,定位到该方法的实现体,编写代码。
添加属性
1. 在 ClassView 视图中右键接口对象,单击“Add Property”;
2. 设置返回值类型、属性类型和名称等信息。操作过程中,系统会显示出即将生成的接口 定义,即“Implementation”显示的内容;
16
ATL 基础操作手册
陈喜庆 QQ:31444465
}; 2. 在该代码的下方将它再复制一遍,并做如下修改:
[ object, uuid(1D6FA790-F365-472e-B898-C9C22DEE9E87),
helpstring("IZoomIn Interface"), pointer_default(unique) ] interface IZoomIn : IUnknown { }; 注:UUID 可通过 VC6 提供的工具“UUIDGEN.EXE”或“GUIDGEN.EXE”获得,具体方法 请参见附录 A。 3. 找到组件类的定义代码段,添加自定义接口; [ uuid(FCA1CF55-7689-47B4-8583-BED680517DC6), helpstring("Zoom Class") ] coclass Zoom { [default] interface IZoom; interface IZoomIn; }; 4. 打开组件类的头文件(Zoom.h),找到类的继承关系代码段,添加新接口的继承关系; class ATL_NO_VTABLE CZoom : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CZoom, &CLSID_Zoom>, public ISupportErrorInfo, public IZoom, public IZoomIn 5. 找到接口映射代码段,添加新接口的映射: BEGIN_COM_MAP(CZoom) COM_INTERFACE_ENTRY(IZoom) COM_INTERFACE_ENTRY(IZoomIn) COM_INTERFACE_ENTRY(ISupportErrorInfo) END_COM_MAP()
15
ATL 基础操作手册
陈喜庆 QQ:31444465
实现预定义接口
1. 在 ClassView 视图中,双击预定义接口的方法或属性,定位到对应的实现体;
2. 编写代码,接口定义文件(ATL_Common.idl),找到如下代码段: [ object, uuid(36A9F333-2591-4493-83FB-F4EBADF87203),
helpstring("IZoom Interface"), pointer_default(unique) ] interface IZoom : IUnknown { [propput, helpstring("property MyProperty")] HRESULT MyProperty([in] BSTR newVal);
添加成员函数
1. 在 ClassView 视图中右键组件类对象,单击“Add Method Function”;
2. 填写返回值类型和函数定义,并设置相应的访问权限,点击“OK”;
3. 双击刚刚创建的功能函数,定位到该函数的实现体,编写代码。
6
ATL 基础操作手册
陈喜庆 QQ:31444465
添加成员变量
newVal); };
12
ATL 基础操作手册
删除属性
1. 在 ClassView 视图中右键属性实现对象,单击“Delete”;
陈喜庆 QQ:31444465
2. 双击属性的定义对象,定位到接口定义文件(ATL_Common.idl)中的属性定义;
3. 删除该属性的定义(红色部分),如下所示: interface IZoom : IUnknown { [propget, helpstring("property MyProperty")] HRESULT MyProperty([out,
陈喜庆 QQ:31444465
ATL 基础操作手册
《手册》详细描述了 ATL 组件式开发的常用操作,系本人经验和心得的总结和完善。对 于想要了解或刚刚接触 ATL COM 的开发人员具有一定的参考价值。由于时间仓促和本人的经 验有限,疏漏之处在所难免,还望斧正。
在此,非常感谢顾学明和李策在工作和生活上对我的关心和指导。感谢赵宏辉反复细心 地阅读本《手册》,并提出了宝贵的修改意见和建议,他为该手册提供了强有力的技术支持。 感谢景翔和何学洲在平日的工作中给予我莫大的帮助。
methodIndex); [propget, helpstring("property MyProperty")] HRESULT MyProperty([out,
retval] BSTR *pVal); [propput, helpstring("property MyProperty")] HRESULT MyProperty([in] BSTR
删除成员变量
在 ClassView 视图中双击需要删除的成员变量,定位后删除该定义。
8
ATL 基础操作手册
陈喜庆 QQ:31444465
编辑接口成员 添加方法
1. 在 ClassView 视图中右键接口对象,单击“Add Method”;
2. 设置返回值类型、方法名和参数。操作过程中,系统将实时显示出即将生成的接口定义, 即“Implementation”里的内容。
if (Enabled == NULL) return E_POINTER;
return E_NOTIMPL; } 5. 切换至组件类头文件(Zoom.h),删除代码段中的实现体,并在定义最后加上分号,如 下所示: STDMETHOD(get_Enabled)(VARIANT_BOOL * Enabled); 6. 重复上面的步骤,完成 ICommand 接口中其它方法和属性的修改。
1. 在 ClassView 视图中右键组件类对象,单击“Add Method Variable”;
2. 填写成员变量的类型和名称,并设置相应的访问权限,点击“OK”。
7
ATL 基础操作手册
陈喜庆 QQ:31444465
删除成员函数
在 ClassView 视图中右键成员函数对象,单击“Delete”。
陈喜庆 QQ:31444465
设置编译环境
1. 设置 Unicode 字符集的调试环境为“Win32 Unicode Debug”;
2. 在 Project 菜单下,单击“Setting”命令。切换至 Debug 属性页,设置“Executable for debug session”项,选择希望调用组件的程序。
10
ATL 基础操作手册
陈喜庆 QQ:31444465
删除方法
1. 在 ClassView 视图中右键方法的实现对象,单击“Delete”;
11
ATL 基础操作手册
陈喜庆 QQ:31444465
2. 双击方法的定义对象,定位到接口定义文件(ATL_Common.idl)中的方法定义;
3. 删除该方法的定义(红色部分),如下所示: interface IZoom : IUnknown { [helpstring("method MyMethod")] HRESULT MyMethod(BSTR methodName,INT
2. 选择“ESRI SystemUI Object Library(1.0)”,单击“OK”;
3. 选择“ICommand”,单击“OK”。
14
ATL 基础操作手册
陈喜庆 QQ:31444465
修改预定义接口的定义和实现
1. 在 ClassView 视图中双击组件类对象,打开组件类头文件(Zoom.h); 2. 找到 ICommand 接口的定义代码段,如下所示:
retval] BSTR *pVal); [propput, helpstring("property MyProperty")] HRESULT MyProperty([in] BSTR
newVal); };
13
ATL 基础操作手册
预定义接口
陈喜庆 QQ:31444465
添加预定义接口
1. 在 ClassView 视图中右键组件类对象,单击“Implement Interface”;
创建 ATL 工程
1. 在 File 菜单下,单击“New”命令。在 Projects 属性页中选择“ATL COM AppWizard”, 并填写工程名称和路径;
2. 不做任何修改,单击“Finish”;
1
ATL 基础操作手册
陈喜庆 QQ:31444465
3. 核对工程信息,单击“OK”。
2
ATL 基础操作手册
4
ATL 基础操作手册
陈喜庆 QQ:31444465
添加工程的引用
1. 在 ATL 工程中,切换至“FileView”视图。双击“StdAfx.h”以打开工程的头文件;
2. 在“#include <atlcom.h>”语句后添加如下代码段,其中斜体部分为类库的引用,采 用“相对路径”方式,当然,具体类库的引用可根据实际需要进行调整。需要注意的是, 某些类库的引用是有顺序要求的。 #pragma warning(push) #pragma warning(disable : 4146) #pragma warning(disable : 4192)
#import "../Include/Com/esriSystem.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE") #import "../Include/Com/esriSystemUI.olb" raw_interfaces_only raw_native_types no_namespace named_guids #import "../Include/Com/esriGeometry.olb" raw_interfaces_only raw_native_types no_namespace named_guids #import "../Include/Com/esriDisplay.olb" raw_interfaces_only raw_native_types no_namespace named_guids #import "../Include/com/esriGeoDatabase.olb" raw_interfaces_only raw_native_types no_namespace named_guids #import "../Include/Com/esriCarto.olb" raw_interfaces_only raw_native_types no_namespace named_guids #import "../Include/Com/esriControls.olb" raw_interfaces_only raw_native_types no_namespace named_guids
#pragma warning(pop) 注:类库的引用可以采用“绝对路径”和“相对路径”两种方式。采用“相对路径”的 好处就是可以很方便地将整个工程移植到其它计算机上,而不需要再次更改类库的引用 路径。当然,事先需要将所引用的类库复制到该工程的指定目录下。
5
ATL 基础操作手册
编辑组件类成员
陈喜庆 QQ:31444465
STDMETHOD(get_Enabled)(VARIANT_BOOL * Enabled) {
if (Enabled == NULL) return E_POINTER;
return E_NOTIMPL; } 3. 切换至组件类实现文件(Zoom.cpp),并将头文件中的代码段复制过来; 4. 将复制过来的代码段稍作修改,修改之后如下所示: STDMETHODIMP CZoomIn::get_Enabled(VARIANT_BOOL * Enabled) {
创建 ATL 对象
1. 在 ClassView 视图中右键工程,单击“New ATL Object”;
2. 选择“Simple Object”;
3
ATL 基础操作手册
陈喜庆 QQ:31444465
3. 在 Names 属性页的 ShortName 中输入名称,前面不需要加“C”或“I”之类的前缀; 4. 在 Attributes 属性页中修改以下内容,点击“确定”。
9
ATL 基础操作手册
陈喜庆 QQ:31444465
3. 双击刚刚创建的方法,定位到该方法的实现体,编写代码。
添加属性
1. 在 ClassView 视图中右键接口对象,单击“Add Property”;
2. 设置返回值类型、属性类型和名称等信息。操作过程中,系统会显示出即将生成的接口 定义,即“Implementation”显示的内容;
16
ATL 基础操作手册
陈喜庆 QQ:31444465
}; 2. 在该代码的下方将它再复制一遍,并做如下修改:
[ object, uuid(1D6FA790-F365-472e-B898-C9C22DEE9E87),
helpstring("IZoomIn Interface"), pointer_default(unique) ] interface IZoomIn : IUnknown { }; 注:UUID 可通过 VC6 提供的工具“UUIDGEN.EXE”或“GUIDGEN.EXE”获得,具体方法 请参见附录 A。 3. 找到组件类的定义代码段,添加自定义接口; [ uuid(FCA1CF55-7689-47B4-8583-BED680517DC6), helpstring("Zoom Class") ] coclass Zoom { [default] interface IZoom; interface IZoomIn; }; 4. 打开组件类的头文件(Zoom.h),找到类的继承关系代码段,添加新接口的继承关系; class ATL_NO_VTABLE CZoom : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CZoom, &CLSID_Zoom>, public ISupportErrorInfo, public IZoom, public IZoomIn 5. 找到接口映射代码段,添加新接口的映射: BEGIN_COM_MAP(CZoom) COM_INTERFACE_ENTRY(IZoom) COM_INTERFACE_ENTRY(IZoomIn) COM_INTERFACE_ENTRY(ISupportErrorInfo) END_COM_MAP()
15
ATL 基础操作手册
陈喜庆 QQ:31444465
实现预定义接口
1. 在 ClassView 视图中,双击预定义接口的方法或属性,定位到对应的实现体;
2. 编写代码,接口定义文件(ATL_Common.idl),找到如下代码段: [ object, uuid(36A9F333-2591-4493-83FB-F4EBADF87203),
helpstring("IZoom Interface"), pointer_default(unique) ] interface IZoom : IUnknown { [propput, helpstring("property MyProperty")] HRESULT MyProperty([in] BSTR newVal);
添加成员函数
1. 在 ClassView 视图中右键组件类对象,单击“Add Method Function”;
2. 填写返回值类型和函数定义,并设置相应的访问权限,点击“OK”;
3. 双击刚刚创建的功能函数,定位到该函数的实现体,编写代码。
6
ATL 基础操作手册
陈喜庆 QQ:31444465
添加成员变量
newVal); };
12
ATL 基础操作手册
删除属性
1. 在 ClassView 视图中右键属性实现对象,单击“Delete”;
陈喜庆 QQ:31444465
2. 双击属性的定义对象,定位到接口定义文件(ATL_Common.idl)中的属性定义;
3. 删除该属性的定义(红色部分),如下所示: interface IZoom : IUnknown { [propget, helpstring("property MyProperty")] HRESULT MyProperty([out,