C++ DllGetClassObject返回“;不支持此类接口”;而CoCreateInstance可以发现它是成功的
我想使用库“sqlceoledb35.dll”来处理.sdf db文件而不使用寄存器。我知道这个dll是一个COM dll,在ADO中使用。C++ DllGetClassObject返回“;不支持此类接口”;而CoCreateInstance可以发现它是成功的,c++,dll,com,sql-server-ce,sqlcedatareader,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 =(DllGetClas
但我无法获取目标接口,它返回错误“不支持此类接口”
下面是代码:
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);
但是在这个代码片段中,\u uuidof(IUnknow)
可以返回一个接口成功,但是IID\u idbidalize
将失败(这个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
接口。其次,它使用传递的IID
调用由此获得的指针上的IClassFactory::CreateInstance
DllGetClassObject
知道如何创建的对象—类工厂—通常不会实现除IClassFactory
之外的任何接口,当然,IUnknown
此链接也很有用