我想使用库"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
。