com: использовать незарегистрированную dll - PullRequest
1 голос
/ 14 июля 2011

Я подключил функцию 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 () со вторым параметром: Я не знаю, как автоматически получить REFIID моей DLL. И если я использую riid , это тоже не работает.

Так что, если у кого-то есть идея, Спасибо!

1 Ответ

0 голосов
/ 14 июля 2011

Если вы хотите следовать надлежащим соглашениям COM, вам необходимо правильно обработать параметры CoCreateInstance (как описано здесь ).

Параметр __in REFIID riid является GUID интерфейс , который вы хотите использовать, а не сама DLL.Параметр CLSID - это класс объекта, который вы должны знать заранее.Поскольку вы хотите вернуть ожидаемый интерфейс, вам на самом деле нужно знать только CLSID вашей новой реализации (coclass) и вызывать его с помощью этого.

Более простой, но не совсем COM-spec, метод - экспортфабрика из вашей 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;
    }
}
...