Win32 DLL Hello

Win32 で "Hello DLL" を表示する DLL を作成します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

DLL の作成

  1. 昔?から使われている Win32 で DLL を作成する方法を説明します。
    Win32 のネイティブモードでは「関数を登録」するのが基本です。
    "Hello DLL" を表示する HelloMsg() 関数を登録した DLL を VC++ のテンプレート機能を使って作成します。
  2. Visual Studio .NET を起動します。
    メニューから[ファイル(F)][新規作成(N)][プロジェクト(P)]を選択します。
    プロジェクトの種類は [Visual C++][Win32] を選択します。
    テンプレートは [Win32 コンソール アプリケーション] を選択します。
    フォルダを選択して Hello のプロジェクト名で [OK] をクリックします。

    アプリケーションの設定で DLL をチェックして [完了] をクリックすると、プロジェクトが生成されます。

  3. Hello.h をプロジェクトに格納して下さい。
    Hello.h のソースコードです。
    // Hello.h
    #include <stdio.h>
    
    #define EXPORT extern "C" __declspec(dllexport)
    
    EXPORT void HelloMsg();
    
  4. stdafx.h に「#include "Hello.h"」を追加します。
    // 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
    // を記述します。
        ・
        ・
        ・
    // TODO: プログラムに必要な追加ヘッダーをここで参照してください。
    #include "Hello.h"
    
  5. プロジェクトに格納されている Hello.cpp を次のように修正して下さい。
    // Hello.cpp : DLL アプリケーションのエントリ ポイントを定義します。
    //
    
    #include "stdafx.h"
    
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        return TRUE;
    }
    
        EXPORT void HelloMsg()
        {
            printf("Hello DLL\n");
        }
    
    #ifdef _MANAGED
    #pragma managed(pop)
    #endif
    
  6. ソリューションのビルドを実行すると Hello.dll と Hello.lib が作成されます。
    二個のファイルは DLL を組み込んでコンパイルするときに必要です。
    デバッグが済めば Release Mode でコンパイルして下さい。

DLL を呼び出す

  1. シンプルなプロジェクトを作成するために「空のプロジェクト」から作成します。
    Visual Studio .NET を起動して[ファイル][新規作成][プロジェクト]を選びます。
    [Visual C++][Win32][Win32コンソールアプリケーション]を選択して Main の名前で作成します。
    画像は容量節約のため他の用途と兼用しているので説明とは異なる場合があるので注意して下さい。

    [アプリケーションの設定]から[コンソールアプリケーション]を選択します。

  2. プロジェクトフォルダーに Hello.dll, Hello.lib, Hello.h, Maim.cpp を格納します。
    Maim.cpp のソースコードです。
    #pragma で "Hello.lib" をプロジェクトに組み込んでいます。
    #include <stdio.h>
    #include <conio.h>
    #include "Hello.h"
    #pragma comment(lib,"Hello.lib")
    
    int main(void)
    {
        HelloMsg();
        _getch();
        return 0;
    }
    
  3. プロジェクトを実行すると "Hello DLL\n" が表示されます。
    Hello.lib はコンパイルするときにだけ参照されます。
    他のフォルダーにプログラムを移すときは Main.exe と Hello.dll をコピーして下さい。

【NOTE】

  1. extern "C" は、C言語の仕様で作成された関数の宣言です。
    この宣言がされた関数は C++ 以前のC言語の仕様に基づいていることを宣言しています。
    拡張子が .c のソースをコンパイルして組み込むときなどに良く使われます。
  2. DllMain() 関数の説明です。
    Windows が起動するときに WinMain() が呼ばれるように、DLL が起動するときに DllMain() が呼ばれます。
    一般的に DllMain() が使われることは少なく、省略すると既定の関数が組み込まれます。
    この関数が呼ばれるタイミングは次のとおりです。
    ・DLL がカレントプロセスのアドレス空間に接続されたとき。
    ・DLL がカレントプロセスのアドレス空間から切り離されたとき。
    ・カレントプロセスが新たにスレッドを作ったとき。
    ・スレッドが正常に終了したとき。
  3. DLL も空のプロジェクトから作成すると、もっとすっきりした構成になります。

超初心者のプログラム入門(C/C++)