我想使用库“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/