見出し画像

Visual Studio2022でDLLファイルを作成する手順

1. はじめに

 DLL(Dynamic Link Library)とは、プログラムの実行時に必要な機能やデータを提供する共有ライブラリのことである。DLLを使用すると、他の言語で書かれたプログラムで同じコードを共有することができる。

 今回は、Visual Studio 2022環境でDLLを作成し、呼び出し側のプログラムから実行するための手順を示す。

2. DLLに関する前提知識

 DLLに関する前提知識を下記に示す。

(1) DLLは単体で動作できない
 DLLにはmain関数が存在せず、単体で動作できない。そのため、通常は実行可能ファイル(例:*.exe)と一緒に動作する。

(2) スタティックライブラリとダイナミックライブラリ
 リンクの種類には、静的リンクと動的リンクが存在する。

 スタティックライブラリは、コンパイル時にプログラムに取り込んで使用する。Windowsでは .lib 形式、Linuxでは .a 形式である。
 ダイナミックライブラリは、プログラム実行時にプログラムに取り込んで使用する。Windowsでは .dll 形式、Linuxでは .so (shared object)形式である。

スタティックを静的、ダイナミックを動的と呼んでもよい。

(3) DLL作成のメリット
 DLLを作成することで、別の言語のプロジェクトに対しても流用することができる。ただし、互換性を保つ記述方法にする必要がある(例:extern "C" など)。

3. DLLの作成手順

 DLLの大まかな作成手順を下記に示す。

(1) DLLファイルを作成する
 Visual Studio 2022(C++)のWindowsデスクトップウィザードのプロジェクトを作成し、*.dllと*.libファイルを出力する。

(2) DLLを呼び出すプログラムを作成する
 C++コンソールアプリケーションを作成し、dllを呼び出すテスト用のプログラムを作成する。

4. DLLを作成する

4.1 新規プロジェクトを作成する

 Visual Studioを開き、「新しいプロジェクトの作成」を選択する。ここで、Windowsデスクトップウィザードを選択し、「次へ(N)」を選択する(図1)。

図1 新規プロジェクト作成画面

4.2 プロジェクト名を設定する

 プロジェクト名と保存先を設定し、「作成(C)」を選択する(図2)。

図2 新規プロジェクト構成

4.3 アプリケーションの種類を設定する

 Windows デスクトッププロジェクト画面で下記の設定を行い、OKを選択する(図3)。
(1) ダイナミックリンクライブラリ(.dll)にチェックする
(2) 空のプロジェクト(E)にチェックする

図3 プロジェクト設定画面

4.4 ソースファイルを追加する

 下記の手順でソースファイルを追加する(図4)。

(1) ソリューションエクスプローラー内にある「ソースファイル」を右クリックする。
(2) 「追加」→「新しい項目」を選択し、ソースファイルを追加する。

図4 ソースファイル追加の様子

 ファイル名は、test.cppとする(図5)。

図5 ファイル名設定

 ファイル作成完了後、DLLが呼び出されたことを示すコードを記述する。

// test.cpp
#include "test.h"
#include <iostream>

// 関数の実装
extern "C" EXAMPLE_API void exampleFunction() {
    std::cout << "DLL内のexampleFunctionが呼び出された" << std::endl;
}

 ここでは、DLLを呼び出したとき、「DLL内のexampleFunctionが呼び出された」と表示する。次に、test.hも同様に追加する。

// test.h
#ifdef PROJECT1_EXPORTS
#define EXAMPLE_API __declspec(dllexport)
#else
#define EXAMPLE_API __declspec(dllimport)
#endif

extern "C" EXAMPLE_API void exampleFunction();

4.5 ビルドする

 ビルドし、dll、lib、pdbファイルを作成する。ビルド(B)の「ソリューションのビルド(B)」を選択する(図6)。

図6 ソリューションのビルドの様子

 図7に示すように、ビルドを正常に通すと、プロジェクトのフォルダ(bin配下)にdllファイルが作成できる(図8)。

図7 ビルドログ
図8 dllファイルの作成結果

 上記から、必要なlib、dllファイルが作成できた。

5. dllの呼び出し側プログラムを作成する

 dllファイルは、呼び出し側プログラムから関数呼び出しで動作する。そこで、呼び出し側のプログラムを作成し、dllが正しく動作するか確認する。

5.1 コンソールアプリケーションを作成する

 Visual Studioから先ほど作成したソリューション内に、C++コンソールアプリケーションを作成する(図9)。

図9 プロジェクトの作成状況

 今回は、同じソリューションファイル内に2つのプロジェクトを作成した。これによって、後々でdllファイルの移動を不要にする。

dllファイル作成と呼び出し側を別々にする場合は、以下2つのどれかを行う(今回は省略)。
(1) ビルド構成でdllファイル作成と同時に、呼び出し側にコピーする設定とする。
(2) 手作業で呼び出し側プログラム内にdllを移動する。

4.2 呼び出し側のプログラムを作成する

 呼び出し側のプログラムを追加する。今回は、dllで作成したexampleFunction関数を呼び出す。なお、test.hをインクルードすることも忘れないこと。

#include "test.h"
#include <iostream>

int main() {
    exampleFunction();
    return 0;
}

4.3 追加のインクルードディレクトリの追加

 追加のインクルードディレクトリを追加する。ここでは、dll側のヘッダファイルがあるフォルダとする(図10)。

筆者は、C:\Users\username\source\repos\Project1\Project1と設定した。

図10 追加インクルードディレクトリの設定

4.4 追加の依存ファイルを追加する

 追加の依存ファイルには、dll作成時に作成したlibファイルを指定する。
筆者の環境では、C:\Users\username\source\repos\Project1\x64\Debug\Project1.libと設定した(図11)。

図11 追加依存ファイルの設定

4.5 ビルドする

 作成したプログラムが、正常にビルドできることを確認する。加えて、exeファイルと同階層にdllがあることも確認する。

 呼び出し側プログラムからdllを呼び出すために、スタートアッププロジェクトを設定する。ConsoleApplicationのプロジェクトを右クリックし、「スタートアッププロジェクトに設定(A)」を選択する(図12)。これによって、呼び出し側のプログラムが起点になる。

図12 スタートアッププロジェクト

4.6 実行する

 実行すると、下記のメッセージを表示する(図13)。

図13 DLL実行時のログ

4.7 呼び出しチェック

 次に、正しくdllが呼び出せたか確認する。

 「ツール」→「コマンドライン」を選択する(図14)。

図14 開発者コマンドプロンプト

 選択すると、Visual Studio用のコマンドプロンプトを表示する(図15)。

図15 開発者コマンドプロンプトの画面

 ここで、cdコマンド(Change Directory)でdllファイルがあるパスまで移動する。移動後、dumpbinコマンドを実行する。

コマンド:dumpbin /exports Project1.dll

 このコマンドは、dll側からexportした関数が正しく外部に公開できているか確認するものである(図16)。

図16 dumpbinの実行結果

 実行すると、dllで定義したexampleFunction関数が外部に公開できていることがわかる。

 次に、デバッガを使用し、dllが正常に読み込めているか確認する。Visual Studioでは、デバッグ中に使用するdllやexeファイルなどの情報はモジュールウィンドウに表示する。そこで、デバッグモードで、「デバッグ」→「ウィンドウ」→「モジュール」を選択する(図17)。

図17 モジュールの場所

 モジュールウィンドウを確認すると、「Project1.dll」と書かれており、正しくdllファイルが読み込めている(図18)。

図18 dllファイルが読み込まれた様子

 これで、作成したdllを実行することができた。

5 おわりに

 今回は、Visual Studio 2022でdllを作成し、コンソールアプリケーションから実行する手順を説明した。dllを使用すると、異なる言語間でもコードが再利用できる。

 機会があれば、今回の手順を参考に作成してみるとよいだろう。

この記事が気に入ったらサポートをしてみませんか?