Visual C++でDLLを作って、rundll32.exeで実行してみました。
目的
「DLLを作ってみたい!」と思い検索したところ、Microsoftがチュートリアルを公開していたので、それを参考にDLLを作ってみました。
作成したDLLを利用するアプリの作成は面倒なので、Windowsの標準コマンド「rundll32.exe」でDLL内の関数を実行することで動作確認してみます。
参考にしたページ
DLLの作成
Visual Studio 2022で作成しました。
プロジェクトの作成
新しいプロジェクトを作成します。名前は「TestDLL」にしました。
テンプレートは「ダイナミック リンク ライブラリ(DLL)」を選択。
ヘッダファイルの作成
[追加] > [新しい] > [ヘッダーファイル(.h)]からヘッダファイルを追加する。
ファイル名は「TestDLL.h」とし、以下内容を記載する。
※関数のエクスポート設定とエクスポートする関数のプロトタイプ宣言を記載
#pragma once #ifdef TestDLL_EXPORTS #define TestDLL_API __declspec(dllexport) #else #define TestDLL_API __declspec(dllimport) #endif extern "C" TestDLL_API void TestFunc();
関数の実装
「dllmain.cpp」に「DllMain関数」と「TestFunc関数」を定義します。
WindowsAPI「MessageBox」でメッセージボックスを表示する関数としました。
#include "pch.h" #include "TestDLL.h" BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: MessageBox(NULL, TEXT("DllMain"), TEXT("DllMain"), MB_OK | MB_ICONINFORMATION); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } void TestFunc() { MessageBox(NULL, TEXT("TestFunc"), TEXT("TestFunc"), MB_OK | MB_ICONINFORMATION); }
DLLのビルド
ビルドするとDLLができました。
動作確認
Windowsには、DLL内の関数を実行する「rundll32.exe」というコマンドがあります。
作成したDLL内の関数をrundll32.exeで実行してみます。
rundll32 TestDLL.dll,TestFunc
無事実行されメッセージボックスが表示されました。