DllGetClassObject 返回"No such interface supported"而 CoCreateInstance 可以发现它成功

DllGetClassObject return "No such interface supported" while CoCreateInstance can find it successful

本文关键字:发现 成功 CoCreateInstance supported No 返回 such interface DllGetClassObject      更新时间:2023-10-16

我想使用库"sqlceoledb35.dll"来处理.sdf数据库文件而无需寄存器。我知道这个 dll 是一个 COM dll 并在 ADO 中使用。
但是我无法获取目标接口,它返回错误"不支持此类接口"。
这是代码:

    CoInitialize(nullptr); 
    HMODULE hmod = CoLoadLibrary((L"sqlceoledb35.dll"), true);
    DllGetClassObject_t pDllGetClassObject =(DllGetClassObject_t)GetProcAddress(hmod,        "DllGetClassObject");
    HRESULT hr=NOERROR;
    IDBInitialize *pIDBInitialize1=NULL;
    IDBInitialize *pIDBInitialize2=NULL;
    hr = pDllGetClassObject(CLSID_SQLSERVERCE_3_5, __uuidof(IUnknown), (void**)&pIDBInitialize1);
    hr = pDllGetClassObject(CLSID_SQLSERVERCE_3_5, IID_IDBInitialize, (void**)&pIDBInitialize2);

但是在这个代码片段中,_uuidof(IUnknow)可以返回接口成功,但IID_IDBInitialize会失败(这个 IID 可以在 CoCreateInstance 中工作,您将在后面看到。

这是另一个可以在具有相同接口 IID 的同一台机器上正常工作的代码:

    CoInitialize(nullptr); 
    hr = CoCreateInstance(  CLSID_SQLSERVERCE_3_5, 
                        0, 
                        CLSCTX_INPROC_SERVER, 
                        IID_IDBInitialize, 
                        (void**)&pIDBInitialize);

所以任何人都可以提供帮助,以便第一个代码片段可以工作?
那么该方法是否CoCreateInstance做更多的工作,这是一个关键?

CoCreateInstance(对于进程内服务器)分两个阶段工作。首先,它加载 DLL 并使用您传递CLSID调用DllGetClassObject,请求IClassFactory接口。其次,它调用IClassFactory::CreateInstance以这种方式获得的指针,以及您传递的IID

DllGetClassObject知道如何创建的对象 - 类工厂 - 通常本身不会实现除IClassFactory之外的任何接口,当然还有IUnknown