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通过包容和继承来实现面向对象
浙公网安备 33010602011771号