文号
t73153
阅读
4489
回复
2
收藏
1
【整理】Win32编程中的ATL常用类
2015/08/15
IP:四川
ATL除了是一个编写COM组件和ActiveX控件的方法之外,还是一个十分有用的Win32、COM应用程序工具库,ATL中很多类在普通应用程序中使用,可大大提高编写Win32应用程序的效率。

一、普通字符串(和MFC共享,但不需要MFC支持)
CString                  普通字符串(ANSI或Unicode字符集)
CStringA                 普通字符串(ANSI字符集)
CStringW                 普通字符串(Unicode字符集)

二、图像加载和显示(和MFC共享,但不需要MFC支持)
CImage                   图像加载和显示(支持JPG、GIF和PNG)

三、Win32系统服务类
CAtlFile                 文件操作
CAtlFileMapping          文件映射操作
CRegKey                  注册表操作

四、路径和URL分析
CPath[A/W]               路径分析
CUrl                     URL分析

五、Visual Basic 类型(应用于IDispatch接口)
CComBSTR                 Visual Basic 计数式字符串(Unicode字符集)(注意:可能含有多个0)
CComVariant              Visual Basic 可变类型
CComSafeArray<t>         Visual Basic 数组
CComSafeArrayBound       Visual Basic 数组边界
CAdapt<t>                将VB类型适配为标准C++类型(屏蔽&操作符,主要用于C++集合类)</t></t>

六、COM接口智能指针(具有自动QueryInterface/AddRef/Release等功能)
CComPtr<t>               通用COM接口指针(现在的版本也实现了QueryInterface)
CComQIPtr<t>             通用COM接口指针(实现了QueryInterface的老版本,不能用于IUnknown和NULL)
CComGITPtr<t>            全局接口表(GIT)COM接口指针</t></t></t>

七、C++智能指针
CAutoPtr<t>               C++智能指针(new、delete运算符)
CAutoVectorPtr<t>         C++数组智能指针(new[]、delete[]运算符)</t></t>

八、内存管理
IAtlMemMgr               通用内存管理接口
CComHeap                 COM堆内存管理(CoTaskMemAlloc、CoTaskMemFree等)
CCRTHeap                 C堆内存管理(malloc、free等)
CLocalHeap               Win32/Local内存管理(LocalAlloc、LocalFree等)
CGlobalHeap              Win32/Global内存管理(GlobalAlloc、GlobalFree等)(效果和CLocalHeap完全相同)
CWin32Heap               Win32/Heap内存管理(HeapAlloc、HeapFree等)

九、Win32窗口类
1.基类
CWindow                           Win32窗口句柄,以及相关WinAPI
CMessageMap                       消息分发功能(必须实现ProcessWindowMessage函数或BEGIN_MSG_MAP)
                                      
2.窗口类
CWindowImpl<t[,tbase,traits]>     窗口实现类(由子类T继承使用)
CDialogImpl<t[,tbase]>            对话框实现类(由子类T继承使用)
CSimpleDialog<idd[,iscenter]>     简单对话框
CContainedWindow                  被包含的窗口
CContainedWindowT<[tbase,traits]> 被包含的窗口(指定基类)
                                      
3.窗口风格类
CWinTraits<style,exstyle>         窗口风格缺省模板
CWinTraitsOR<style,exstyle,tbase> 窗口风格增量模板
CControlWinTraits                 控件风格
CFrameWinTraits                   框架窗口风格
CMDIChildWinTraits                MDI子窗口风格</style,exstyle,tbase></style,exstyle></[tbase,traits]></idd[,iscenter]></t[,tbase]></t[,tbase,traits]>

十、ActiveX控件容器
1.常用窗口类
CAxWindow                         ActiveX控件
CAxWindow2                        带许可的ActiveX控件
CAxWindowT<[tbase]>               ActiveX控件(指定基类)
CAxWindow2T<[tbase]>              带许可的ActiveX控件(指定基类)
CAxDialogImpl<t[,tbase]>          带有ActiveX控件的对话框(由子类T继承使用)
                                     
2.常用事件接收器
IDispEventImpl<id,t[,iid,...]>    IDispatch事件接收器(由子类T继承使用,需定义BEGIN_SINK_MAP)
IDispEventSimpleImpl<id,t,iid>    IDispatch事件接收器(不需要类型库)(由子类T继承使用,需定义BEGIN_SINK_MAP)
IPropertyNotifySinkCP<t[,cdv]>    属性更改事件接收器(由子类T继承使用,需定义OnChanged和OnRequestEdit)
                                     
3.ATL定义的常用接口
IAxWinHostWindow                  ActiveX控件宿主窗口
IAxWinHostWindowLic               带许可的ActiveX控件宿主窗口
IAxWinAmbientDispatch             宿主窗口的环境属性</t[,cdv]></id,t,iid></id,t[,iid,...]></t[,tbase]></[tbase]></[tbase]>
[ 修改于11年4个月前 - 2015/08/22 08:53:26 ]
acmilan作者
11年3个月前修改于 11年3个月前IP:四川
789507
1楼
关于COM自动化智能类型的使用:
1. CComPtr<IDispatch>特化出了很多成员函数,其中最好用的是InvokeN,InvokeN只有4个参数,大大简化了使用。而IDispatch::Invoke则有8个参数,使用较为不便。
2. CComVariant可以当原生VARIANT使用(数据长度也是相同的,可以当数组用),可以帮助自动释放资源。
3. CComBSTR因为BSTR是一次性资源。用这个东西,你得知道它在哪里被建立要Empty一下。
4. CComSafeArray<T>好用,可以Attach和Detach进行加锁和解锁。
引用
评论
acmilan作者
11年3个月前IP:四川
789512
2楼
所谓自动化(Automation),就是可以与VB、VBScript、JScript、VB for Application等其它微软编程语言进行弱类型交互的能力。应用程序不用知道任何类型信息,只要知道组件名称(ProgID)和方法(Method)或属性(Property)的名称即可与之交互。从组件名称(ProgID)可以由CLSIDFromProgID然后CoCreateInstance来创建组件。支持自动化的组件必须支持IDispatch接口。IDispatch接口中,比较重要的有GetIDsOfNames可以获取方法或属性的ID(DISPID),Invoke可以调用方法或者属性。自动化必须使用VARIANT或VARIANT所能表示的类型,比如INT,LONG,VARIANT_BOOL,BSTR,SAFEARRAY等,不能使用其它类型。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的