DllGetClassObject возвращает "Такой интерфейс не поддерживается", в то время как 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 делать больше работы, которая является ключом?

1 ответ

Решение

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

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

Другие вопросы по тегам