![見出し画像](https://assets.st-note.com/production/uploads/images/134495565/rectangle_large_type_2_978f0860b6480f5a16b3fe3afbf1999b.png?width=1200)
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)。
![](https://assets.st-note.com/img/1710664866408-8I7hkhh8Bt.png?width=1200)
4.2 プロジェクト名を設定する
プロジェクト名と保存先を設定し、「作成(C)」を選択する(図2)。
![](https://assets.st-note.com/img/1710665022806-Du18zplcIW.png?width=1200)
4.3 アプリケーションの種類を設定する
Windows デスクトッププロジェクト画面で下記の設定を行い、OKを選択する(図3)。
(1) ダイナミックリンクライブラリ(.dll)にチェックする
(2) 空のプロジェクト(E)にチェックする
![](https://assets.st-note.com/img/1710665137835-tZyOLFJksT.png?width=1200)
4.4 ソースファイルを追加する
下記の手順でソースファイルを追加する(図4)。
(1) ソリューションエクスプローラー内にある「ソースファイル」を右クリックする。
(2) 「追加」→「新しい項目」を選択し、ソースファイルを追加する。
![](https://assets.st-note.com/img/1710665377344-LBdMJH1jDN.png?width=1200)
ファイル名は、test.cppとする(図5)。
![](https://assets.st-note.com/img/1710665341258-g9gITDCFGR.png?width=1200)
ファイル作成完了後、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)。
![](https://assets.st-note.com/img/1710665513146-lrME3ERWlU.png)
図7に示すように、ビルドを正常に通すと、プロジェクトのフォルダ(bin配下)にdllファイルが作成できる(図8)。
![](https://assets.st-note.com/img/1710851586553-mBZSJqUigh.png)
![](https://assets.st-note.com/img/1710851549605-zFbXYtmqh7.png)
上記から、必要なlib、dllファイルが作成できた。
5. dllの呼び出し側プログラムを作成する
dllファイルは、呼び出し側プログラムから関数呼び出しで動作する。そこで、呼び出し側のプログラムを作成し、dllが正しく動作するか確認する。
5.1 コンソールアプリケーションを作成する
Visual Studioから先ほど作成したソリューション内に、C++コンソールアプリケーションを作成する(図9)。
![](https://assets.st-note.com/img/1710761740257-ENcFfwmViU.png)
今回は、同じソリューションファイル内に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と設定した。
![](https://assets.st-note.com/img/1710761995573-VFyDM3UItO.png?width=1200)
4.4 追加の依存ファイルを追加する
追加の依存ファイルには、dll作成時に作成したlibファイルを指定する。
筆者の環境では、C:\Users\username\source\repos\Project1\x64\Debug\Project1.libと設定した(図11)。
![](https://assets.st-note.com/img/1710762138375-iEw6LY8Sr9.png?width=1200)
4.5 ビルドする
作成したプログラムが、正常にビルドできることを確認する。加えて、exeファイルと同階層にdllがあることも確認する。
呼び出し側プログラムからdllを呼び出すために、スタートアッププロジェクトを設定する。ConsoleApplicationのプロジェクトを右クリックし、「スタートアッププロジェクトに設定(A)」を選択する(図12)。これによって、呼び出し側のプログラムが起点になる。
![](https://assets.st-note.com/img/1710852465996-2hVl737pGP.png)
4.6 実行する
実行すると、下記のメッセージを表示する(図13)。
![](https://assets.st-note.com/img/1710852582098-v6FrhapjEz.png)
4.7 呼び出しチェック
次に、正しくdllが呼び出せたか確認する。
「ツール」→「コマンドライン」を選択する(図14)。
![](https://assets.st-note.com/img/1710852656458-Nq2tuJZq1X.png)
選択すると、Visual Studio用のコマンドプロンプトを表示する(図15)。
![](https://assets.st-note.com/img/1710853034781-Atb1pdbTxf.png?width=1200)
ここで、cdコマンド(Change Directory)でdllファイルがあるパスまで移動する。移動後、dumpbinコマンドを実行する。
コマンド:dumpbin /exports Project1.dll
このコマンドは、dll側からexportした関数が正しく外部に公開できているか確認するものである(図16)。
![](https://assets.st-note.com/img/1710853172647-hzltcsgOzC.png?width=1200)
実行すると、dllで定義したexampleFunction関数が外部に公開できていることがわかる。
次に、デバッガを使用し、dllが正常に読み込めているか確認する。Visual Studioでは、デバッグ中に使用するdllやexeファイルなどの情報はモジュールウィンドウに表示する。そこで、デバッグモードで、「デバッグ」→「ウィンドウ」→「モジュール」を選択する(図17)。
![](https://assets.st-note.com/img/1710853424579-gTEOkstNiR.png?width=1200)
モジュールウィンドウを確認すると、「Project1.dll」と書かれており、正しくdllファイルが読み込めている(図18)。
![](https://assets.st-note.com/img/1710853563689-ZVweZ1erf7.png?width=1200)
これで、作成したdllを実行することができた。
5 おわりに
今回は、Visual Studio 2022でdllを作成し、コンソールアプリケーションから実行する手順を説明した。dllを使用すると、異なる言語間でもコードが再利用できる。
機会があれば、今回の手順を参考に作成してみるとよいだろう。
この記事が気に入ったらサポートをしてみませんか?