Я хочу использовать библиотеку «sqlceoledb35.dll» для обработки файла .sdf db без регистрации. Я знаю, что это DLL-библиотека COM и используется в 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);
Так что любой может помочь, чтобы 1-й фрагмент кода мог работать?
Так сделал метод CoCreateInstance
делать больше работы, которая является ключом?
CoCreateInstance
(для серверов in-proc) работает в два этапа. Во-первых, он загружает DLL и вызывает DllGetClassObject
с CLSID
Вы проходите, прося IClassFactory
интерфейс. Во-вторых, это вызывает IClassFactory::CreateInstance
на указатель, полученный таким образом, с IID
Вы передаете.
Объект, который DllGetClassObject
умеет создавать — фабрика классов — делает не обычно сам реализует любые интерфейсы, кроме IClassFactory
и, конечно же, IUnknown
,
Других решений пока нет …