c++ - DllGetClassObject 返回 "No such interface supported"而 CoCreateInstance 可以找到它成功

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

我想使用库“sqlceoledb35.dll”来处理没有注册的.sdf db 文件。我知道这个 dll 是一个 COM dll 并在 ADO 中使用。
但是我无法获取目标接口(interface),它返回错误“不支持这样的接口(interface)”。
代码如下:

    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)可以返回一个接口(interface)成功,但是IID_IDBInitialize会失败(这个IID可以在CoCreateInstance,稍后你会看到。

这是在同一接口(interface)IID的同一台机器上可以正常工作的另一段代码:

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

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

最佳答案

CoCreateInstance(用于进程内服务器)分两个阶段进行。首先,它加载 DLL 并使用您传递的 CLSID 调用 DllGetClassObject,请求 IClassFactory 接口(interface)。其次,它使用您传递的 IID 在由此获得的指针上调用 IClassFactory::CreateInstance

DllGetClassObject 知道如何创建的对象——类工厂——通常自身实现除IClassFactory 之外的任何接口(interface),并且,当然,IUnknown

关于c++ - DllGetClassObject 返回 "No such interface supported"而 CoCreateInstance 可以找到它成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18737799/

相关文章:

c++ - OpenCV 训练 : Mergevec error: Input file does not exist or not readable

c++ - KEY_WOW64_32KEY 未从 x64 应用程序重定向

asp.net - ASP.NET 中的 C++/CLI 组件出现 "module could not be found"错误

c++ - 进入拖放过程(或任何其他系统调用)

c# - 使用显式接口(interface)实现时如何选择将哪个成员导出到COM?

c++ - 在 64 位环境中加载 native COM DLL

c++ - 为什么以下代码片段会加速代码?

c++ - 在 C++ 中查找单词

c# - 从 C++ DLL 调用 C# 函数

com - 将对象嵌入到 Microsoft Word 和 OpenOffice Writer 中