DLLの作成と使い方

最終更新 2003 12/01

サンプルのダウンロード→Exp_AboutDLL.lzh(133k)

サンプルプログラムのスクリーンショット


DLLの作成方法と使い方は、いくつものやり方があります。
ですから、ここで説明するのはほんの一例に過ぎません。


まずは作る(DLLの作成方法)
1.ファイル(F) - 新規作成(N) を選択 ファイル(F) - 新規作成 を選択 2.プロジェクト - Win32 Dynamic-Link Library - プロジェクト名(N) - OK の   順に選択 プロジェクト - Win32 Dynamic-Link Library - プロジェクト名(N) - OK の順に選択 プロジェクト名はとりあえず DLL_Test としました。 3.空の DLL プロジェクト(E) - 終了(F) を選択 空の DLL プロジェクト(E) - 終了(F) を選択 4.OK を選択 OK を選択 5.プロジェクト(P) - プロジェクトへ追加(A) - 新規作成(N) を選択 プロジェクト(P) - プロジェクトへ追加(A) - 新規作成(N) 6.C++ソースファイル - ファイル名(N) - OK を選択 C++ソースファイル - ファイル名(N) - OK を選択 ファイル名は dll_main としていますが、自分の好きなように付ける ことができます。 OKボタンを押すと、下のようなタイトルバーに dll_main.cpp と 書いてあるソースエディタが出てきます。 ここにプログラムのコードを書き込みます。 7.ソースエディタにプログラムのコードを書く ソースエディタにプログラムのコードを書く 全ソースコード APIで組むウィンドウプログラムは WinMain を使いますが、DLLの場合は DllMain という関数をメイン関数として使います。 特に処理する事がないので戻り値を返しているだけで終わっています。 DLLとして使いたい関数は test の方です。先頭にごちゃごちゃと色々な言葉が 並んでいますが extern "C" __declspec( dllexport ) これをつけることで、DLLファイルにしたあと、別のアプリケーションから この関数を呼び出せるようになります。 8.F7キーを押してビルドする F7キーを押すか、メニューの ビルド(B) - ビルド(B) を選択して ビルドします。 ソースに間違いがなければ、DLLファイルが作られます。 F5 や Ctrl+F5 は使わないで下さい。
作ったら使わなきゃ(作成したDLLの使用方法)
1.ファイル(F) - 新規作成(N) を選択 ファイル(F) - 新規作成 を選択 2.プロジェクト - Win32 Application - プロジェクト名(N) - OK の順に選択 プロジェクト - Win32 Dynamic-Link Library - プロジェクト名(N) - OK の順に選択 プロジェクト名はとりあえず Dll_Exe_Test としました。 3.空のプロジェクト(E) - 終了(F) を選択 空のプロジェクト(E) - 終了(F) を選択 4.OK を選択 OK を選択 5.プロジェクト(P) - プロジェクトへ追加(A) - 新規作成(N) を選択 プロジェクト(P) - プロジェクトへ追加(A) - 新規作成(N) 6.C++ソースファイル - ファイル名(N) - OK を選択 C++ソースファイル - ファイル名(N) - OK を選択 ファイル名は main としていますが、自分の好きなように付けることが できます。 OKボタンを押すと、下のようなタイトルバーに main.cpp と書いてある ソースエディタが出てきます。 ここにプログラムのコードを書き込みます。 7.ソースエディタにプログラムのコードを書く ソースエディタにプログラムのコードを書く 全ソースコード DLLのヘッダファイルをインクルードしない場合は、関数のポインタを typedef を使って、型名として使えるようにしないとうまく動きません。 ずいぶんと特殊な typedef の使い方をしていますが、この使い方は MSDNのヘルプにしっかりと書かれています。以下にその内容を抜粋します。
typedef type-declaration synonym;
    
typedef キーワードは指定した type-declaration の同義語を定義します。
synonym で指定した識別子が、その型の別名になります。型のインスタンスの
名前にはなりません。typedef 指定子は関数の宣言内では使えません。
    
typedef 宣言は、スコープ内において宣言の decl-specifiers で指定された
型の別名となる名前を導入します。class、struct、union、および enum 宣言と
異なり、typedef 宣言は新しい型を導入せず、既存の型に対する新しい名前を
導入します。
    
例
    
// typedef キーワードの例
typedef unsigned long ulong;
    
ulong ul;     // "unsigned long ul;" と等価
    
typedef struct mystructtag
{
    int   i;
    float f;
    char  c;
} mystruct;
    
mystruct ms;   // "struct mystructtag ms;" と等価

typedef int (*funcptr)();  // funcptr は int を返す関数への
                           //    ポインタと等価
    
funcptr table[10];   // "int (*table[10])();" と等価
ソースには必要最小限のことしか書いていないので、DLLの関数を 呼び出して使用するのに、どんな処理が必要なのかは、ソースを 良く見て下さい。 8.DLL_Test\Debug フォルダの DLL_Test.dll を Dll_Exe_Test\Debug   フォルダへコピー DLL_Test\Debug フォルダの DLL_Test.dll を 選択 DLL_Test\Debug フォルダの DLL_Test.dll を 選択 DLL_Test\Debug フォルダの DLL_Test.dll を コピー DLL_Test.dll を コピー Dll_Exe_Test\Debug フォルダへ移動 コピーした DLL_Test.dll を Dll_Exe_Test\Debug フォルダへ貼り付け 完了 完了 DLL_Test で作成したDLLファイルを、現在のワークスペースの Debug フォルダへコピーします。 Debug 環境でない場合は、これから作成されるExeファイルと同じ フォルダにコピーします。 もしくは hInstanceDLL = LoadLibrary( DLL_Test.dllのある場所 ); LoadLibrary() の引数に DLL_Test.dll が置いてあるフォルダのパスを 指定します。 パスを指定した場合は、DLL_Test.dll を、現在のワークスペースの Debug フォルダへコピーする必要はありません。 dllファイルは指定した場所から直接読み込まれます。 9.F7キーを押してビルドする F7キーを押すか、メニューの ビルド(B) - ビルド(B) を選択して ビルドします。 F5 あるいは Ctrl+F5 キーでもかまいません。 実行画面 エラーがなければ、このようなメッセージボックスが表示されます。 いろいろとDLLってみる
もっと簡単に DLL を使うには? API 関数のように DLL を使うには VC++ で作成した DLL を Boland C++ Builder で使う

| next | home |