たれながし.info

とあるITエンジニアの備忘録

Visual C++でDLLを作ってみた

Visual C++でDLLを作って、rundll32.exeで実行してみました。

目的

「DLLを作ってみたい!」と思い検索したところ、Microsoftチュートリアルを公開していたので、それを参考にDLLを作ってみました。

作成したDLLを利用するアプリの作成は面倒なので、Windowsの標準コマンド「rundll32.exe」でDLL内の関数を実行することで動作確認してみます。

参考にしたページ

learn.microsoft.com

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

無事実行されメッセージボックスが表示されました。