COM组件

没有动态链接的组件,就相当与没有装备的消防员

 

对组件生命周期的管理是通过接口引用计数来实现的,在实现IUnknown之后组件和客户之间非常松散的连接

 

DLL相当于一个组件服务器

 

 CLSID 组件ID (类标识符)

ProgID 是coder给CLSID指定的一个易于记住的名字

 

COM库的初始化一般只在EXE中进行

CoInitialize VS CoUninitialize

 

OLE建立在COM之上

OleInitialize VS OleUninitialize

 

COM通过任务内存分配器来解决内存的分配和释放问题

比如在组件钟分配的内存然后由客户程序使用,这时候需要由客户去释放

CoTaskMemAlloc VS CoTaskMemFree

 

RegSvr32.exe 用来注册组件

DllRegisterServer 和 DllUnRegisterServer

 

CoGetClassObject返回的是类厂中某个接口的指针,返回一个IClassFactory指针

CoCreateInstance返回的是组件中某个接口的指针

CoCreateInstance实际上是通过CoGetClassObject实现的

 

 

 

 1 HRESULT CoCreateInstance(const CLSID & clsid,
 2                          IUnknown * pUnknown,
 3                          DWORD dwClsContext,
 4                          const IID & iid,
 5                          void ** ppv)
 6 {
 7     *ppv = NULL;
 8     IClassFactory * pICalssFactory;
 9     HRESULT hr = CoGetClassObject(clsid, 
10                     dwClsContext,
11                     NULL,
12                     IID_FACTORY,
13                     void ** (&pIClassFactory));
14     if (SUCCEEDED(hr))
15     {
16         hr = pIClassFactory->CresteInstance(pUnknown, iid, ppv);
17         ...
18         pIClassFactory->Release();
19     }
20 
21     return hr;
22 }

 

 

类厂的一个实例只能创建通某个CLSID相对应的组件,因为IClassFactory::CreateInstance是不接受CLSID参数的

 

COM不支持组件继承,但支持接口继承

COM通过包容和继承来实现面向对象

 

 

posted on 2014-05-27 15:18  aoun  阅读(589)  评论(0)    收藏  举报