VC中使用com组件的另一种方法
我们知道在vc中最常用的是通过CoCreateInstance来创建com组件的实例,今天我们介绍另一种更为灵活的方法。
先看代码:
HINSTANCE hComInstance = NULL; ICalc * pICalc = NULL; //加载组件 hComInstance = CoLoadLibrary(L"CalcAtlCom.dll",FALSE); if (hComInstance != NULL) { IClassFactory * pIFactory = NULL; HRESULT hr = CoGetClassObject(CLSID_Calc,CLSCTX_INPROC_SERVER,NULL,IID_IClassFactory,(void**)&pIFactory); if (SUCCEEDED(hr)) { hr = pIFactory->CreateInstance(NULL,IID_ICalc,(void**)&pICalc); pIFactory->Release(); } } //使用组件,调用pICalc接口的Add方法完成加法操作。 if (pICalc != NULL) { long lResult = pICalc->Add(3,5); CString strMsg; strMsg.Format("3+5=%d",lResult); AfxMessageBox(strMsg); } //释放组件 if (hComInstance != NULL) { if (pICalc != NULL) { pICalc->Release(); pICalc = NULL; } CoFreeLibrary(hComInstance); }
简单介绍一下代码,在加载组件的时候通过CoLoadLibrary把组件库加载到内存,然后通过CoGetClassObject可以创建组件工厂,最后通过组件工厂的CreateInstance方法来创建组件的实例。在释放组件时,先释放组件实例,然后通过CoFreeLibrary释放组件库。
之所以说这样写比较灵活,主要应用一下几个情况:
1.当想要创建一个组件库中多个组件的实例时,只创建一个组件工厂实例,就可以通过多次调用组件工厂的CreateInstance方法,来依次创建各组件的实例。这样做可以获得更好的效率。而用CoCreateInstance来创建,每调用一次就会创建一个组件工厂,有些浪费。
2.当想使用许可或权限访问组件的高级属性时,只需要将IClassFactory换成IClassFactory2即可。IClassFactory2从IClassFactory继承,多了GetLicInfo,RequestLicKey,CreateInstanceLic几个方法,来传入正确的密钥或许可证来合法访问组件。而用CoCreateInstance无法满足这方面的要求。