0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[初級] C++: COMコンポーネントの使い方(ビルド関係)

Posted at

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 インターフェースはすべてが純粋仮想関数であり、そもそも実装がないのでリンクもされない。実行時に動的に解決される。

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?