簡単な COM クライアントの実装

それでは、前節で作成した COM コンポーネントを利用するプログラムを書きましょう。 COM コンポーネントを利用するプログラムは、COM のクライアントなどと言います。

前節では ICar インターフェイスの Run メソッドや Stop メソッドを定義し、実装しました。 それらはどうやって呼び出せばよいのでしょうか?

COM のメソッドの呼び出し方

ここでは COM クライアントの詳細をおいておき、作ったばかりの ICar インターフェイスをどのように呼び出すのか具体的にみてみましょう。
個々の呼び出しについては後ほど説明します。

次のコードを carclient1.cpp として保存してください。

#include <stdio.h>

#include "..\car\Car.h"


void Test() {

     HRESULT hr;
     
     hr = ::CoInitialize(NULL); 

     if(FAILED(hr)){
          printf("CoInitialize Failed.\n");
          return;
     }

     ICar* pICar = NULL;

     hr = CoCreateInstance(
          __uuidof(Car),
          NULL, 
          CLSCTX_ALL, 
          __uuidof(ICar),
         (void**)&pICar);

     if(SUCCEEDED(hr)) {
          pICar->Run();
          pICar->Release();
     }
     else {
          printf("CCI Failed. %p\n", hr);
     }

     ::CoUninitialize();

}


int main() {

     Test();

     return 0;
}

Car.h ヘッダファイルをインクルードしています。これは前節までに作成した COM コンポーネントを作ったときに MIDL コンパイラが生成したものです。

この他、ヘッダファイルをインクルードする代わりにタイプライブラリをインポートする方法もあります。

#import "..\car\Car.tlb" no_namespace

タイプライブラリを使ったほうがいいことがあるので、そちらのほうが良いのですが、ここではまずはオーソドックスに ヘッダファイルを読み込んでいます。(タイプライブラリの方法はまた後ほど)

main 関数からは Test という関数を呼び出しています。Test 関数の中で、COM の呼び出しを行っています。

上記コードをビルドして EXE ファイルを作り実行すれば、COM メソッドが呼び出せたことがわかるはずです。
ビルドする際、ole32.lib をリンクするのを忘れないようにしてください。

実行したときに次のように表示されれば OK です。

> carclient1.exe
Run!

>

次のような表示になってしまった場合は、COM を登録するのを忘れています。

> carclient1.exe
CCI Failed. 80040154

>

この場合は regsvr32 コマンドで COM を登録してください。

« 前の記事 次の記事 »
簡単な COM コンポーネントの実装 COM プログラミング入門 目次

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説