我已经连接了cocreateinstance()函数。 当使用特定的CLSID调用它时,我想使用我的dll而不是dll系统。
所以这是我的代码:
HOOK_CoCreateInstance(rclsid,pUnkOuter,dwClsContext,riid,*ppv){
...
if(myCLSID){
module = LoadLibrary(mydll);
dllGetClassObject = (FUNC)GetProcAddress(module,"DllGetClassObject");
hr = dllGetClassObject(rclsid, IID_IClassFactory, &pClassFactory);
hr = pClassFactory->CreateInstance(NULL,IID_IUnknown, (void**)&data_source);
return hr;
}
else{
hr = CoCreateInstanceReal(rclsid,pUnkOuter,dwClsContext,riid,ppv);
return hr;
}
}
但它不起作用。
我认为问题出现在pClassFactory :: CreateInstance()中,第二个参数是: 我不知道如何自动检索我的DLL的REFIID。 如果我使用 riid ,它也无法正常工作。
所以,如果有人有想法, 谢谢!
答案 0 :(得分:0)
如果要遵循正确的COM约定,则需要正确处理CoCreateInstance参数(如文档here所示)。
__in REFIID riid
参数是您要使用的接口的GUID,而不是DLL本身。 CLSID参数是对象的类,您应该提前知道。因为您想要返回预期的接口,所以您只需要知道新实现(coclass)的CLSID并使用它进行调用。
一种更简单但不完全是COM规范的方法是从DLL导出工厂:
__declspec(dllexport) MyObject * CreateObject()
{
return new MyObject();
}
并从你的包装器中调用它:
HOOK_CoCreateInstance(rclsid,pUnkOuter,dwClsContext,riid,*ppv)
{
if(myCLSID)
{
module = LoadLibrary(mydll);
dllCreate = (FUNC)GetProcAddress(module,"CreateObject");
*ppv = dllCreate();
return S_OK;
} else {
hr = CoCreateInstanceReal(rclsid,pUnkOuter,dwClsContext,riid,ppv);
return hr;
}
}