DllGetClassObject返回“没有这样的接口支持”,而CoCreateInstance可以找到它成功

时间:2013-09-11 09:44:20

标签: c++ dll com sql-server-ce sqlcedatareader

我想使用库“sqlceoledb35.dll”来处理没有寄存器的.sdf db文件。我知道这个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做了更多的工作是关键吗?

1 个答案:

答案 0 :(得分:1)

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

DllGetClassObject知道如何创建的对象 - 类工厂 - 通常本身实现IClassFactory以外的任何接口,当然还有{{1} }。