0

ライブラリ「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はキーとなるより多くの作業を行いましたか?

4

1 に答える 1

2

CoCreateInstance(インプロセス サーバーの場合) は 2 段階で動作します。まず、DLL をロードし、パスDllGetClassObjectを使用して呼び出し、インターフェイスCLSIDを要求しIClassFactoryます。IClassFactory::CreateInstance次に、このようにして取得したポインターを呼び出しIIDます。

DllGetClassObject作成方法を知っているオブジェクト (クラス ファクトリ) 自体は通常IClassFactory、 およびもちろんIUnknown.

于 2013-09-11T12:23:40.013 に答える