软件架构师何志丹
1、创建COM组件的框架。(组件已注册)
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(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&pClassFactory);
pClassFactory->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);
pClassFactory->Release();
........
}
//①-------------------
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);//接口ID
IClassFactory *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
{
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~