VC++からOLEオートメーション(COMの呼び出し)をする場合の手続きの話。
タイプライブラリの読み込みエラー
C++のアプリケーションからOLEオートメーションを呼び出すにはCOMモジュールの呼び出し同様に、#importでモジュールのタイプライブラリを作成して行う方法もある。
しかし、自己実行可能形式(EXE形式)などで後からOLEサーバが追加されたような場合には、次のようなエラーに見舞われる。
エラー(fatal error C1083: タイプ ライブラリ ファイルを開けません。'<Importしたいライブラリの場所>’: タイプ ライブラリ/DLL の読み込みエラーです。)
そのような場合には、CoInitialize関数を呼び出し、COMが利用できるようにして、CLSIDFromProgID関数で呼び出すOLEオートメーションサーバのProgIDを引数としてCLSIDを取得する。
COMモジュールのインタフェイスと変数宣言した後に、CreateInstance関数でインスタンス化して、実際のメソッドにアクセスする。COMモジュールの利用が終わったら、Release関数で、インスタンスを開放する。
最後にCoUninitialize関数でCOMの後始末をして終了。
OLE呼び出しコード
すべてのコードは次の通り
CoInitialize(NULL); CLSID clsid; HRESULT hr = CLSIDFromProgID(L"<呼び出すOLEオートメーションサーバのProgID>", &clsid); IDispatch* pDispatch = NULL; if(SUCCEEDED(hr)) { hr = ::CoCreateInstance(clsid, 0, CLSCTX_LOCAL_SERVER, IID_IDispatch, reinterpret_cast<void**>(&pDispatch)); if(SUCCEEDED(hr)) { DISPID dispid; OLECHAR* szMember = L"<メソッド名>"; DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; hr = pDispatch->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid); hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparamsNoArgs, NULL, NULL, NULL); if(pDispatch != NULL) { pDispatch->Release(); } <span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span> } } CoUninitialize();
短い投稿になりましたが、備忘録のために記録しておきます。
スポンサーリンク
最後までご覧いただきありがとうございます。