本文共 3078 字,大约阅读时间需要 10 分钟。
IUnknown *pUnk = NULL;
IObject *pObject = NULL;
CoInitialize(NULL);
CoCreateInstance(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IDD_Unknown, (void**)&pUnk);
pUnk->QueryInterface(IID_IObject, (void**)&pObject);
pUnk->Release();
pObject->Func();
pObject->Release();
CoUninitialize();
CoCreateInstance的内部:
CoCreateInstance(....)
{ ....... IClassFactory *pClassFactory=NULL;
//①-------------------
CoGetClassObject的内部:
CoGetClassObject(.....)
{ //通过查注册表CLSID_Object,得知组件DLL的位置、文件名 //使用LoadLibrary装入DLL库 //使用函数GetProcAddress( "DllGetClassObject" )得到DLL库中函数DllGetClassObject的函数指针。 //调用DllGetClassObject }DllGetClassObject是用来获得类工厂对象的,只有先得到类工厂才能去创建组件。
DllGetClassObject代码:
HRESULT_export//②----------------
CFactory::CreateInstance(.....)
{ ........... CObject *pObject = new CObject; //组件对象 pObject->QueryInterface(IID_IUnknown, (void**)&pUnk); pObject->Release(); ........... }
实例:
CComPtr<IAVIer> m_piAVIer;
m_piAVIer.CoCreateInstance(L"AVI.AVIer");
2、通过LoadLibrary和DllGetClassObject创建组件对象(组件未注册)
CComPtr<IAVIer> m_piAVIer;
typedef int (WINAPI *DllGetClassObjectPtr)(REFCLSID, REFIID, LPVOID*);
HMODULE hModule = LoadLibrary(dll文件路径);
//得到DllGetClassObject函数地址
DllGetClassObjectPtr ProcPtr = (DllGetClassObjectPtr)GetProcAddress(hModule, "DllGetClassObject");
CLSID rclsid;
IID riid; ::CLSIDFromString(A2W("{D5A365A3-44F8-47A0-8FCF-062372B1EB83}"), &rclsid);//类ID ::IIDFromString(A2W("{BE136856-CBEA-4079-A02B-BBC7A382BDB3}"), &riid);//接口IDIClassFactory *pICF = NULL;//类工厂接口指针
ProcPtr(rclsid, IID_IClassFactory, (void**)(&pICF));//获取类工厂接口指针
//以上相当于①
pICF->CreateInstance(NULL, riid, (void**)&m_piAVIer);//创建COM对象
//以上相当于②
pICF->Release();
备注:
AVIer.rgs文件
HKCR
{avi.idl文件
library AVILib
{
转载地址:http://iirmb.baihongyu.com/