single.php

Visual C++のOLEオートメーションへのアクセス

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"&lt;呼び出すOLEオートメーションサーバのProgID&gt;", &amp;clsid);
IDispatch* pDispatch = NULL;
if(SUCCEEDED(hr))
{
hr = ::CoCreateInstance(clsid, 0, CLSCTX_LOCAL_SERVER, IID_IDispatch, reinterpret_cast&lt;void**&gt;(&amp;pDispatch));
if(SUCCEEDED(hr))
{
DISPID dispid;
OLECHAR* szMember = L"&lt;メソッド名&gt;";
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = pDispatch-&gt;GetIDsOfNames(IID_NULL, &amp;szMember, 1, LOCALE_USER_DEFAULT, &amp;dispid);
hr = pDispatch-&gt;Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &amp;dispparamsNoArgs, NULL, NULL, NULL);
if(pDispatch != NULL)
{
pDispatch-&gt;Release();
}
&lt;span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"&gt;&lt;/span&gt;  }
}
CoUninitialize();

短い投稿になりましたが、備忘録のために記録しておきます。

スポンサーリンク

最後までご覧いただきありがとうございます。
 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です