DLL の基礎



DLL(Dynamic Link Library) の作成方法と DLL を使ったプログラムを説明します。
DLL とは実行時に動的にリンクされるライブラリで、DLL こそが Windows System の骨格を構成するプログラム群なのです。
WINDOWS\system32 のフォルダーを開いてみて下さい。DLL が山のように格納されています。

DLL を開発しているのは Microsooft だけではありません。
多くの Heavy User が様々なプログラムを開発して、誰もが自由に使えるように提供してくれています。
DLL が使えるようになると、一挙に多くの協力者を得ることになり、何故か「とってもプログラムがうまくなった」ような気がします。

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

ライブラリの作成

  1. 新しいプロジェクトから [Win32 アプリケーション][DLL] をチェックしてプロジェクト(Dlltxt)を作成します。
  2. Dlltxt のフォルダーに DLL のヘッダファイル(Dlltxt.h)を格納してプロジェクトに追加して下さい。
    Dlltxt.h のソースコードです。
        // dlltxt.h
        #define EXPORT extern "C" __declspec(dllexport)
    
        EXPORT BOOL CALLBACK DisplayText(HDC, int, int, LPSTR);
        
  3. テンプレートで作成された Dlltxt.cpp に DisplayText() 関数のソースコードを追加します。
    "dlltxt.h" をインクルードします。
    プリコンパイルヘッダ(stdafx.h)を使っているときは "stdafx.h" の中でインクルードするのがルールかも知れません。
    実質的に実行される命令は TextOut() 関数だけです。
        // Dlltxt.cpp : DLL アプリケーションのエントリ ポイントを定義します。
        //
    
        #include "stdafx.h"
        #include "dlltxt.h"
        BOOL APIENTRY DllMain( HANDLE hModule, 
                               DWORD  ul_reason_for_call, 
                               LPVOID lpReserved
                             )
        {
            return TRUE;
        }
    
        EXPORT BOOL CALLBACK DisplayText(HDC hdc, int x, int y, LPSTR msgstr)
        {
            TextOut(hdc,x,y,msgstr,strlen(msgstr));
            return TRUE;
        }
        
  4. [ビルド(B)][Dlltxt のビルド(U)] を実行すると DLL が作成されます。
    メインプログラムの作成に必要なファイルは、次の三個です。
    Debug Mode でコンパイルするとファイルサイズが大きくなります。
    ファイル名説明
    Dlltxt.h DLL の関数を定義したヘッダファイルです
    Dlltxt.dll 実行時に呼び出される DLL ライブラリです
    Dlltxt.lib コンパイル時に使用するライブラリです

アプリケーションの作成

  1. DLL を使ったメインプログラムを作成します。
    [ファイル] [新規作成] [プロジェクト] から新規プロジェクト(Calltxt)を作成します。
  2. ライブラリを作成したフォルダーから次のファイルをコピーしてきます。
    Dlltxt.h をプロジェクトに追加して下さい。
    ファイル名説明
    Dlltxt.dll 実行時に呼び出される DLL ライブラリです
    Dlltxt.lib コンパイル時に使用するライブラリです
    Dlltxt.h DLL のヘッダファイルです
  3. [プロジェクト] [プロパティ] [リンカ] [入力] から Dlltxt.lib をリンクします。
    #pragma を使ってリンクすることもできます。
    Dlltxt.lib はコンパイル時に参照されるだけで、実際に実行される関数は実行時に DLL から読み込まれます。
  4. テンプレートで作成された Calltxt.cpp のソースコードを修正します。
    ファイルの最初の方に dlltxt.h をインクルードするコードを追加します。
    プリコンパイルヘッダを使っているときは "stdafx.h" の中でインクルードするのがルールかも知れません。
        // Calltxt.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
        //
    
        #include "stdafx.h"
        #include "Calltxt.h"
        #define MAX_LOADSTRING 100
        #include "dlltxt.h"
        
  5. Calltxt.cpp の修正の続きです。
    WM_PAINT: に DisplayText(); のソースコードを追加します。
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO: 描画コードをここに追加してください...
            DisplayText(hdc,150,60,"Dll DisplayText  Output Message");
            EndPaint(hWnd, &ps);
            break;
        
  6. [デバッグ] [デバッグなしで開始] を選択して、ビルド(コンパイル)に続いて実行を行います。
    コンパイルの進行状況とエラーがあれば、エラーメッセージが表示されます。
  7. 作成された EXE プログラムの実行には Dlltxt.dll が必要です。
    EXE と同じフォルダーまたは Windows\system32 のフォルダーに格納して下さい。

プログラムの説明

  1. DLL(Dynamic Link Library) は Windows System の中核をなすファイル郡で、C:\Windows\system32 (または C:\Windows\system) のフォルダーに腐るほど多くのライブラリが格納されていることからも、 その重要性がわかるでしょう。
  2. DLL とは実行時に動的にリンクされるライブラリで、プログラムの本体をさわらなくてもエラーの修正や 改良ができるようになります。
  3. DLL の中には Microfoft だけで無く、心強いパワーユーザが開発したものも多く、DLL が使えるようになると 一段とプログラムの幅が広がります。
  4. 今回登録する関数は TextOut() だけの簡単なものです。
        EXPORT BOOL CALLBACK DisplayText(HDC hdc, int x, int y, LPSTR msgstr)
        {
            TextOut(hdc,x,y,msgstr,strlen(msgstr));
            return TRUE;
        }
        
  5. 呼び出すコードは次のようになります。
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO: 描画コードをここに追加してください...
            DisplayText(hdc,150,60,"Dll DisplayText  Output Message");
            EndPaint(hWnd, &ps);
            break;
        
  6. C++/CLI の DLL(Dynamic Link Library) で詳しく説明しています。
    超初心者のプログラム入門(C# Frame Work)でも同様のプログラムを作成しています。
    C# Hello DLL を参照して下さい。

【演習】

DLL を使ったプログラムは、下記のページを参照して下さい。
何か簡単な関数を DLL で作成して、プログラムの作成手順を理解して下さい。

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