DLLの作り方と利用法

2000.5.12 by K. Masaki

プログラムの概要

DLLの作り方と、DLLの静的リンク、動的リンクを利用したサンプルプログラムです。

プログラムのポイント


プログラムの作成手順

  1. DLLの作り方

    [ファイル|新規作成]で新規作成ページのDLLウィザードを選びます。出てきた WindowはOKでそのまま進みます。Unit1.cppを編集する画面が出るので、とりあえず [ファイル|すべて保存]でUnit1.cppをsampledll.cppに、Project1.bprを sampledll.bprで新しいフォルダに保存します。そして編集画面でページ選択の Unit1.cppと書かれた部分(図の矢印の部分)で右クリックをして ソースヘッダファイルを開きます。 そこでテキストファイルの作成を選択します。File1.txtが作成されたらFile1.txt ページを開いて[ファイル|名前を付けて保存]でsampledll.hという名前で保存します。

    sampledll.hに
    extern "C" __declspec(dllexport) void __stdcall Func1(void);
    と書き入れます。
    sampledll.cppの一番下の行から
    #include "sampledll.h"

    void __stdcall Func1()
    {
        ShowMessage("Func1");
    }
    //----------------------------------
    と書き入れます。
    そして[プロジェクト|sampledllをメイク]を実行します。


  2. DLLの静的リンク

    [ファイル|アプリケーションの新規作成]をします。1と同様に[ファイル|すべて保存]で Unit1.cppはそのまま、Project1.bprをSample.bprの名前でSampledllと同じフォルダに保存 します。コンポーネントパレットのStandardページのButtonコンポーネントをダブルクリック します。そしてオブジェクトインスペクタで配置したボタンのプロパティを表示してCaptionを Func1に変更します。
    フォームに配置したボタンをダブルクリックすると編集画面に

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    }
    
    が出るので、{ と }の間に
    Func1();
    を書き加えます。

    そして静的リンクをするためにUnit1.cppの上のほうに #include "Unit1.h" がありますが、 その下に #include "sampledll.h" を追加します。
    そして[プロジェクト|プロジェクトに追加]で sampledll.lib を追加します。
    これでコンパイルすればsampledllを利用したプログラムができます。


  3. DLLの動的リンク

    [ファイル|アプリケーションの新規作成]をします。Unit2.cppはそのままでProject1.bprを Sample2.bprの名前でSampledllと同じフォルダに保存します。フォームのグリッド面をクリック してオブジェクトインスペクタでフォームのイベントページを選択します。OnCreateの右側を ダブルクリックすると

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    }
    
    があらわれるので、{ と }の間に
    Func = LoadLibrary("sampledll");
    PFunc = (void __stdcall (*)(void))GetProcAddress(Func,"Func1");
    を書き入れます。

    編集ウインドウでページ選択のUnit2.cppの部分で右クリックでヘッダファイルを開きます。

    private:  //ユーザー宣言
    の下に
    HINSTANCE Func;
    void __stdcall (*PFunc1)(void);
    を書き加えます。以上でDLLを使う準備ができました。
    フォームにボタンをひとつ配置して、それをダブルクリックして

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    }
    
    が出るので、{ と }の間に
    PFunc1();
    を書き加えます。以上でコンパイルすると実行できます。

プログラムの問題点

ソースプログラム(LZH 圧縮 file)

こんなプログラム例が欲しい(後の人への課題)


masaki@tube.ee.uec.ac.jp