COM クライアントプログラムのビルドについて
C++、COM、タイプ ライブラリ
本記事の前提条件は以下の通りです。
- 初心者向け
- とは言っても、何らかのプログラムはそれなりに書けるけど、C とか C++ はちょっと、という人向け
- ざっくり概要しか説明しないので細かいことは気にしないでいただきたい
- Visual Studio 2013 くらい~
- Windowsプログラム (CUI, GUI)
- コードの検証
- 開発環境: Visual Studio 2022, x64, Release ビルド
- 実行環境: Windows 10
- 本記事は上から順番に読む前提となっている
- 「Visual Studio 2013 くらい~」と書いてあるが、本記事の内容だと現在過去未来のどのバージョンでもほぼ同じ
前提知識として必要と思われる情報
はじめに
C++ で COM クライアントのプログラムを作成する場合、一般的な C++ のプログラムと少々異なる状況になるので、これについて書いてみる。
ポイントとしては、「ヘッダーファイルがない!」「どうやってリンクするの?」というところかと思う。
まず「タイプ ライブラリ」について説明する。
タイプ ライブラリ
- COM コンポーネントの情報は、「タイプ ライブラリ」というバイナリ形式のデータとして保存される
- タイプ ライブラリには、COM コンポーネントの情報や、COM インターフェースの情報、メソッドのシグネチャ(関数名、引数など)の情報が含まれている
- タイプ ライブラリは MIDL (IDL コンパイラ) が、IDL ファイルをコンパイルすることによって生成される
タイプ ライブラリの格納先
- 設定によるが、基本的にプロジェクトのビルド時に MIDL によって、
.tlb
として作成される - これも設定によるが、COM コンポーネントの DLL (EXE, OCX なども含む) 自体に格納される場合がある
タイプ ライブラリの参照
- C++ ソースファイルの
#import
プリプロセッサ ディレクティブによって、指定した.dll
.tlb
などタイプ ライブラリを含むファイルから COM インターフェースのシグネチャ情報を抽出し、C++ コード向けのヘッダファイルが生成される - ヘッダファイルは通常中間ディレクトリに出力される
- ヘッダファイルの拡張子は、
.tlh
と.tli
である
なお、オートメーションとして利用される場合は、IDispatch インターフェースによって実行時にクライアントから参照される。
ヘッダーファイル
前述のように、#import
プリプロセッサ ディレクティブによって生成された .tlh
.tli
がインクルードされることで、コンパイル可能となる。
リンクは不要
C++ において、COM インターフェースはすべてが純粋仮想関数であり、そもそも実装がないのでリンクもされない。実行時に動的に解決される。
以上。