2011-07-14 143 views
1

我已經掛鉤了cocreateinstance()函數。 當用特定的CLSID調用它時,我想用我的dll代替dll系統。com:使用未註冊的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

什麼工作不準確如果你使用'riid'? – sharptooth

+0

如果我使用riid,我的dll會被加載,但是系統dll也會被加載。 – Chicago

+0

什麼時候系統DLL加載? – sharptooth

回答

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; 
    } 
} 
+0

那麼,我沒有「mydll」的來源,所以我不能添加工廠 – Chicago