はじめに
Visual Studio 2017 Visual C++ による ATL の基本
を参考にさせて頂きました。圧倒的感謝……!
COM DLLはActiveXコントロール(旧 OLEコントロール)とも言うようだ。
環境
実行環境:Windows 10 Home (64bit)
開発環境:Visual Studio Community 2019
C++ によるデスクトップ開発
最新の v142 ビルド ツール用 C++ ATL (x86 および x64)
オプションにチェックが入っていること。
プロジェクトの作成
プロジェクト テンプレート:ATL プロジェクト [C++]
プロジェクト名:ATLProject1
[ATL プロジェクト]ダイアログはデフォルト。
ATLProject1PSというプロジェクトも作られるが今回はノータッチ。
クラスの追加
ソリューション エクスプローラーの ATLProject1 に新しい項目を追加する。
種類:Visual C++/ATL/ATL シンプル オブジェクト
名前:ATLSimpleObject
[ATL シンプル オブジェクト]ダイアログ
ProgID:Simple.Obj
その他はデフォルト。
メソッドの追加
メニューから表示→クラス ビューを選択する。
クラス ビュー
ATLProject1/IATLSimpleObject にメソッドを追加する。
[IDL メソッドの追加]ダイアログ
メソッド名:Hello
パラメーター
[in] BSTR msg
メソッドの実装
クラス ビュー
CATLSimpleObject を選択すると下の枠に Hello(BSTR msg) が表示されるのでダブルクリック。
STDMETHODIMP CATLSimpleObject::Hello(BSTR msg)
{
MessageBox(nullptr, msg, L"ATLSimpleObject", MB_OK);
return S_OK;
}
ビルド
ソリューション構成:Release
ソリューション プラットフォーム:x64
ソリューションのビルド。
識別子 "CLSID_ATLSimpleObject" が定義されていません
というエラーが出るようならソリューションの再スキャン。
管理者権限の PowerShell やコマンド プロンプトでレジストリに登録する。
regsvr32 "C:\Projects\vc++\ATLProject1\x64\Release\ATLProject1.dll"
regsvr32 "C:\Projects\vc++\ATLProject1\x64\Release\ATLProject1.dll" /u
で登録解除。
テストプログラム
JScript
var simple = new ActiveXObject("Simple.Obj");
simple.Hello("hello, JScript");
というファイルを用意しダブルクリックする。
クラスの追加で指定した ProgID を指定。
C#
プロジェクトに参照を追加する。
[参照マネージャー]ダイアログ
COM/ATLProject1Lib をチェックする。
ソリューション プラットフォーム:x64
private void button1_Click(object sender, EventArgs e)
{
var simpleObject = new ATLProject1Lib.ATLSimpleObject();
simpleObject.Hello("hello, C#");
}