2011-07-14 31 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()の2番目のパラメータにあると思います。 私のDLLのREFIIDを自動的に取得する方法がわかりません。 riidを使用しても動作しません。

だれでも考えがある場合は、 ありがとうございます!

+0

'riid'を使ったら? – sharptooth

+0

私がriidを使用すると、私のDLLがロードされますが、システムDLLもロードされます。 – Chicago

+0

システムdllはいつどの時点でロードされますか? – sharptooth

答えて

0

適切なCOM規則に従う場合は、正しいCoCreateInstanceパラメータ(hereと記載)を処理する必要があります。

__in REFIID riidパラメータは、インターフェイスのGUIDであり、DLL自体ではありません。 CLSIDパラメータはオブジェクトのクラスです。事前に知っておく必要があります。予想されるインターフェイスを返すため、実際には新しい実装(コクラス)のCLSIDを知り、それを使用して呼び出すだけで済みます。

シンプルな、しかし、この方法は、あなたのDLLから工場をエクスポートするCOMスペックはかなりなりません。

__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

関連する問題