com:使用未注册的dll

时间:2011-07-14 15:22:17

标签: dll com

我已经连接了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 ,它也无法正常工作。

所以,如果有人有想法, 谢谢!

1 个答案:

答案 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;
    }
}