我想使用库“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
做了更多的工作是关键吗?
答案 0 :(得分:1)
CoCreateInstance
(对于进程内服务器)分两个阶段工作。首先,它加载DLL并使用您传递的DllGetClassObject
调用CLSID
,要求IClassFactory
接口。其次,它会调用IClassFactory::CreateInstance
这样获得的指针,并传递IID
。
DllGetClassObject
知道如何创建的对象 - 类工厂 - 不通常本身实现IClassFactory
以外的任何接口,当然还有{{1} }。