Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

VS2019 VC++ ATLでCOM DLLを作ってみた

はじめに

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) が表示されるのでダブルクリック。

ATLSimpleObject.cpp
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

hello.js
var simple = new ActiveXObject("Simple.Obj");
simple.Hello("hello, JScript");

というファイルを用意しダブルクリックする。
クラスの追加で指定した ProgID を指定。

C#

プロジェクトに参照を追加する。
[参照マネージャー]ダイアログ
COM/ATLProject1Lib をチェックする。

ソリューション プラットフォーム:x64

Form1.cs
        private void button1_Click(object sender, EventArgs e)
        {
            var simpleObject = new ATLProject1Lib.ATLSimpleObject();
            simpleObject.Hello("hello, C#");
        }
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away