COM/ATL
文章平均质量分 80
I_ask_who
这个作者很懒,什么都没留下…
展开
-
COM、ATL学习的几本书点评
Essential COM:中级教程我看的是En版,这种很艰深的书还是看原版的比较不容易走火入魔。作者Don Box现在好像成了.Net大佬,不过该书非常经典,美中不足的是有一些问题没有论述。书的末尾有一个例子,但是每一章没有实例,所以显得艰深。这个例子我没有实现。 COM技术内幕:初级教程只有中文翻译版,初学者可以看懂,基本没有什么内幕,建议看完后(或者不看)直接Essentia原创 2012-09-27 22:27:19 · 1184 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.CAutoPtr
ATL提供了CAutoPtr, CAutoVectorPtr, CAutoPtrArray, and CAutoPtrList,它们具有类似auto_ptr功能,而没有抛出异常,并且不需要借助于CRT库。The CAutoPtr and CAutoVectorPtr Classes例子: STDMETHODIMP CMyClass::SomeFunc() { CFoo*原创 2012-10-06 17:30:23 · 595 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 4.Debugging
ASSERT#ifndef ATLASSERT #define ATLASSERT(expr) _ASSERTE(expr)#endif 上述这个宏依赖CRT传输到debug outputinline void _cdecl AtlTrace(LPCST原创 2012-10-06 22:49:15 · 626 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 5.COM Server review
有3种类型的COM Serverin-process server (DLL)提供了4个入口BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved); //当线程创建和销毁时被OS调用原创 2012-10-07 10:46:05 · 564 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 5.Object Map
由于有3种COM Server,ATL提供了CAtlModule的派生类对应CAtlDllModuleT:in-process dllCAtlExeModuleT:out-process exeCAtlServiceModuleT:system service exe CAtlModule使用了Object Map管理server中所有的类CAtlModule的职责找到原创 2012-10-07 12:11:58 · 706 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 6.Table driven QueryInterface
The Raw Interface MapATL实现QueryInterface的方法是调用CComObjectRootBase::InternalQueryInterface():static HRESULT WINAPI CComObjectRootBase::InternalQueryInterf原创 2012-10-07 15:22:44 · 516 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 6.各种interface map宏
COM_INTERFACE_ENTRY and COM_INTERFACE_ENTRY_IID#define COM_INTERFACE_ENTRY_IID(iid, x) \ { &iid, offsetofclass(x, _ComMapClass), _ATL_SIMPLEMAPENTRY},COM_INTERFACE原创 2012-10-07 16:09:30 · 655 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 7.ATL Persistence implements
The Property MapPROP_ENTRY (szDesc, dispid, clsid)PROP_ENTRY_EX (szDesc, dispid, clsid, iidDispatch)PROP_DATA_ENTRY (szDesc, member, vt) IPersistPropertyBagImpl只能实现对VARIANT的读写VT_UI原创 2012-10-07 21:37:37 · 586 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 6.interface map tricks
Handling Name Conflicts接口定义有时会遇到命名冲突,例如:interface ICowboy : IUnknown { HRESULT Draw();};interface IArtist : IUnknown { HRESULT Draw();}; // Ace Powell was a cowboy/a原创 2012-10-07 16:30:57 · 429 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 7.COM Persistence
需要保存自身状态的object应该提供IPersistMedium,这里Medium=Stream,Storage,PropertyBag等client决定何时在何种媒体上要保存object的状态,调用IPersistMedium的Load(),Save(),并且为这两个函数提供相应的IMedium接口所有的IPersistMedium都派生自IPersist接口:interface原创 2012-10-07 17:26:01 · 814 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 5.CAtlModule
The _AtlModule Global Variable每一个项目,wizard都会生成一个全局变量_AtlModule,用户可以通过全局指针_pAtlModule来访问它,例如:class CMathModule : public CAtlDllModuleT {public: DECLARE_LIBID(LIBID_Math) DECLARE_REGIS原创 2012-10-07 14:28:05 · 796 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 4.IUnknown
Standalone Reference Countingtemplate class CComObjectRootEx : public CComObjectRootBase中的类型定义:typedef ThreadModel _ThreadModel;typedef typename _ThreadModel::AutoCriticalSection _CritSec;t原创 2012-10-06 21:27:04 · 681 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.CComVariant
在使用COM时,有时候用户不知道函数的输入参数,输出参数的具体类型。例如用户传入long类型,函数会把用户传入的long转换成自己想要的参数类型例如BSTR。其中起到关键作用的就是VARIANT类型VARIANT.vt==当前存储的数据类型VARIANT.(bVal,iVal,...,pvarVal,byref)==当前存储的数据 正确使用VARIANT需要注意:需要使用Var原创 2012-10-01 11:52:47 · 568 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.SAFEARRAY
A Review of the COM SAFEARRAY Data Type为了在COM函数间传递Array参数,IDL定义了SAFEARRAY类型:interface IMyInterface : IUnknown { HRESULT GetArray([out,retval] SAFEARRAY(VARIANT_BOOL)*原创 2012-10-01 16:40:49 · 503 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.CComPtr CComQIPtr
A Review of Smart Pointers使用smart pointers的好处:对象析构时,自动release interface发生异常时,创建在栈上的对象自动release interfaceassignment操作时,旧的interface自动release,新的interface自动AddRef提供不同的构造函数可以在大部分用raw pointer的地方原创 2012-10-01 21:55:09 · 804 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 2
String Data Types, Conversion Classes, and Helper Functions对于字符串表示,不同的系统有不同的方法C/C++使用在字串末尾加NulVB,Java,Pascal在字串头部标识字串长度COM使用OLECHAR作为字符类型,COM的字符串为Nul结尾的OLECHARs,用LPOLESTR表示。如果向COM interface传递t原创 2012-09-28 10:53:30 · 603 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.CComGITPtr
Global Interface Table (GIT)提供了进程内interface共享机制,用户可以高效的在套间之间传递interface.使用GIT通常需要下面几步:1..源套间在GIT中注册interface,需要调用IGlobalInterfaceTable系统服务,取得一个cookieHRESULT RegisterMyInterface(IMyInterface* p原创 2012-10-01 22:23:52 · 637 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.CComSafeArray
template VARTYPE _vartype = _ATL_AutomationType::type>class CComSafeArray { ... public:原创 2012-10-01 19:05:17 · 650 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.ATL Memory Managers
A Review of Windows Memory ManagementWindows有三种内存stack 栈:用于分配本地变量,大小在编译时确定,分配与释放仅需移动栈指针memory-mapped files 内存映射文件:不讨论heap 堆:用于分配动态变量,大小在运行时确定,使用heap manager进行分配和回收 在Windows中,每个进程启动时会分配一个de原创 2012-10-06 18:37:25 · 438 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 4.Creators
由于CreateInstance过程中需要调用FinalConstruct,用户很容易忘记,所以ATL提供了Creator类,这些类提供了一个静态函数static HRESULT WINAPI CreateInstance(void* pv, REFIID riid, LPVOID* ppv);CComCreatortemplate原创 2012-10-06 22:32:01 · 493 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 4.Thread
Instance Data SynchronizationCComCriticalSection:使用Init()生成,Term()销毁CComAutoCriticalSection:使用构造函数生成,析构函数销毁CComSafeDeleteCriticalSection:Init()生成,析构函数销毁CComAutoDeleteCriticalSection:未定义Term(),原创 2012-10-06 19:42:48 · 748 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 8.COM Collection and Enumeration Interfaces
COM Collection接口定义类似于:[ object, dual ]template typename T>interface ICollection : IDispatch { [propget] HRESULT Count([out, retval] long* pnCount); [id(DISPID_VALUE), propget] HRES原创 2012-10-10 23:02:54 · 899 阅读 · 0 评论