2011-07-14 57 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