COM/ATL
文章平均质量分 80
I_ask_who
这个作者很懒,什么都没留下…
展开
-
COM、ATL学习的几本书点评
Essential COM:中级教程 我看的是En版,这种很艰深的书还是看原版的比较不容易走火入魔。作者Don Box现在好像成了.Net大佬,不过该书非常经典,美中不足的是有一些问题没有论述。书的末尾有一个例子,但是每一章没有实例,所以显得艰深。这个例子我没有实现。 COM技术内幕:初级教程 只有中文翻译版,初学者可以看懂,基本没有什么内幕,建议看完后(或者不看)直接Essentia原创 2012-09-27 22:27:19 · 1206 阅读 · 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 · 613 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 4.Debugging
ASSERT #ifndef ATLASSERT #define ATLASSERT(expr) _ASSERTE(expr) #endif 上述这个宏依赖CRT 传输到debug output inline void _cdecl AtlTrace(LPCST原创 2012-10-06 22:49:15 · 642 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 5.COM Server review
有3种类型的COM Server in-process server (DLL) 提供了4个入口 BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved); //当线程创建和销毁时被OS调用原创 2012-10-07 10:46:05 · 582 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 5.Object Map
由于有3种COM Server,ATL提供了CAtlModule的派生类对应 CAtlDllModuleT:in-process dll CAtlExeModuleT:out-process exe CAtlServiceModuleT:system service exe CAtlModule使用了Object Map管理server中所有的类 CAtlModule的职责 找到原创 2012-10-07 12:11:58 · 727 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 6.Table driven QueryInterface
The Raw Interface Map ATL实现QueryInterface的方法是调用CComObjectRootBase::InternalQueryInterface(): static HRESULT WINAPI CComObjectRootBase::InternalQueryInterf原创 2012-10-07 15:22:44 · 531 阅读 · 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 · 675 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 7.ATL Persistence implements
The Property Map PROP_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 · 604 阅读 · 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 · 442 阅读 · 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 · 827 阅读 · 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 · 810 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 4.IUnknown
Standalone Reference Counting template class CComObjectRootEx : public CComObjectRootBase 中的类型定义: typedef ThreadModel _ThreadModel; typedef typename _ThreadModel::AutoCriticalSection _CritSec; t原创 2012-10-06 21:27:04 · 696 阅读 · 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 · 586 阅读 · 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 · 514 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.CComPtr CComQIPtr
A Review of Smart Pointers 使用smart pointers的好处: 对象析构时,自动release interface 发生异常时,创建在栈上的对象自动release interface assignment操作时,旧的interface自动release,新的interface自动AddRef 提供不同的构造函数 可以在大部分用raw pointer的地方原创 2012-10-01 21:55:09 · 814 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 2
String Data Types, Conversion Classes, and Helper Functions 对于字符串表示,不同的系统有不同的方法 C/C++使用在字串末尾加Nul VB,Java,Pascal在字串头部标识字串长度 COM使用OLECHAR作为字符类型,COM的字符串为Nul结尾的OLECHARs,用LPOLESTR表示。如果向COM interface传递t原创 2012-09-28 10:53:30 · 618 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.CComGITPtr
Global Interface Table (GIT)提供了进程内interface共享机制,用户可以高效的在套间之间传递interface. 使用GIT通常需要下面几步: 1..源套间在GIT中注册interface,需要调用IGlobalInterfaceTable系统服务,取得一个cookie HRESULT RegisterMyInterface(IMyInterface* p原创 2012-10-01 22:23:52 · 659 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.CComSafeArray
template VARTYPE _vartype = _ATL_AutomationType::type> class CComSafeArray { ... public:原创 2012-10-01 19:05:17 · 680 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 3.ATL Memory Managers
A Review of Windows Memory Management Windows有三种内存 stack 栈:用于分配本地变量,大小在编译时确定,分配与释放仅需移动栈指针 memory-mapped files 内存映射文件:不讨论 heap 堆:用于分配动态变量,大小在运行时确定,使用heap manager进行分配和回收 在Windows中,每个进程启动时会分配一个de原创 2012-10-06 18:37:25 · 455 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 4.Creators
由于CreateInstance过程中需要调用FinalConstruct,用户很容易忘记,所以ATL提供了Creator类,这些类提供了一个静态函数 static HRESULT WINAPI CreateInstance(void* pv, REFIID riid, LPVOID* ppv); CComCreator template原创 2012-10-06 22:32:01 · 506 阅读 · 0 评论 -
ATL Internals 2ed复习.chapter 4.Thread
Instance Data Synchronization CComCriticalSection:使用Init()生成,Term()销毁 CComAutoCriticalSection:使用构造函数生成,析构函数销毁 CComSafeDeleteCriticalSection:Init()生成,析构函数销毁 CComAutoDeleteCriticalSection:未定义Term(),原创 2012-10-06 19:42:48 · 765 阅读 · 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 · 921 阅读 · 0 评论