DllGetClassObject return & quot; такой интерфейс не поддерживается & quot; в то время как CoCreateInstance может найти его успешным

Я хочу использовать библиотеку «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 делать больше работы, которая является ключом?

0

Решение

CoCreateInstance (для серверов in-proc) работает в два этапа. Во-первых, он загружает DLL и вызывает DllGetClassObject с CLSID Вы проходите, прося IClassFactory интерфейс. Во-вторых, это вызывает IClassFactory::CreateInstance на указатель, полученный таким образом, с IID Вы передаете.

Объект, который DllGetClassObject умеет создавать — фабрика классов — делает не обычно сам реализует любые интерфейсы, кроме IClassFactory и, конечно же, IUnknown,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]