Visual C++からCOM(Component Object Model)へアクセスする場合の手続きの話。
COMとOLE
Microsoftさんが提唱したソフトウェアの再利用的な処理を行うための技術で、ほかにも「ActiveX」だの「DCOM」だの時代の流れに応じて名前を変えてWindowsの中で用語として進化してきた。
私の中での認識は、その中でも「COM」は、すべてを包括的に識別するための代物で、従来アプリケーション間にインターフェイスを用いて通信することが目的として作られているソフトウェアの事を「COM」と呼んでいる。
別記事で「Visual C++のOLEオートメーションへのアクセス」を紹介しているが、処理的には似ている。OLEオートメーションへの接続は別記事をご覧ください。
#import構文でタイプライブラリを作成
別記事で紹介した「Visual C++のOLEオートメーションへのアクセス」では、ProgIDと呼ばれるレジストリに登録されているキーワードから用意されているインタフェイスへの接続の手続きを行っていました。
今回は、COM(コンポーネント)モジュールへのアクセスに、#import 構文を使って行います。
#import "<COMモジュールの場所>\sample.dll" rename_namespace("SAMPLECOM") named_guids
“rename_namespace”は必要ない場合が多いですが、名前空間(ネームスペース)が重複するとビルド時に困ったことになるので、独自の名前(例では”SAMPLECOM”の部分)に変更しておいた方が無難です。
この構文で、VC++がタイプライブラリと呼ばれるCOM内のインターフェイス一覧を作ってくれます。ビルド時にプロジェクトには、.tlbの拡張子を持つファイルが追加されます。
実際にプログラムが実行される場合には、このタイプライブラリを通して、受け渡しが行われるので利用するCOMに更新があった場合には、タイプライブラリを更新する必要があります。
COM呼び出しコード
VC++からCOMで用意されているメソッドにアクセスするすべてのコードは次の通りです。
#import "<COMモジュールの場所>\sample.dll" rename_namespace("SAMPLECOM") named_guids
CoInitialize(NULL);
SAMPLECOM::ISampleComPtr pSampleCom = NULL;
HRESULT hr = S_OK;
if(pSampleCom == NULL)
{
hr = pSampleCom.CreateInstance(SAMPLECOM::CLSID_SampleCom);
if(SUCCEEDED(hr))
{
USES_CONVERSION;
hr = pSampleCom-><COMモジュール内のメソッド名>(<メソッドのパラメータ>);
if(SUCCEEDED(hr))
{
}
pSampleCom.Release();
}
}
CoUninitialize();
OLEオートメーションへのアクセスと違ってシンプルです。これはタイプライブラリとして、先にメソッドやプロパティの場所などが一覧化されているためです。
逆に考えると、タイプライブラリを前もって作っておく必要があるので、ビルド後にCOMモジュール側に改変があった場合には、再ビルドする可能性があります。
ProgIDを使った呼び出し方法の場合には、呼び出し方が複雑な反面、COM側の改変でも再ビルドしないですむ可能性が高くなります。
この辺りは、リリース後のプログラム更新頻度などで検討する部分になります。
スポンサーリンク
最後までご覧いただきありがとうございます。