第11章 dllを作る


今回はBCCでdllを作ってみます。作り方は簡単です。理屈は面倒です。



BCC Developerでマイドキュメントの中にあるMyProjectBCCにdll01というプロジェクトを作ります。



プロジェクトの設定では、ターゲットを「Dynamic Link Library(-WD)」とします。



プロジェクトにソースファイル「dll01.cpp」を追加します。

さて、このファイルにdllのプログラムを書きます。

// dll01.cpp

#include <windows.h>
#include <stdio.h>
#include "dll01.h"


MYEXPORT int name_check(char *szName)
{
    char szStr[256];
    
    printf("あなたの名前を教えてください----");
    gets(szName);
    if (strcmp(szName, "") == 0)
        return -1;
    sprintf(szStr, "あなたの名前は%sさんですか\n", szName);
    printf(szStr);
    return 0;
}
「MYEXPORT」って何だ?と思われるかもしれませんが、これはdll01.hの中で defineしておきます。
// dll01.h

#define MYEXPORT extern "C" __declspec(dllexport)

MYEXPORT int name_check(char *);

このヘッダファイルをソースと同じフォルダに入れておきます。 本来
extern "C" __declspec(dllexport) int name_check(char *);
とするところを面倒なので、MYEXPORTに置き換えているのです。

さて、これをビルドするとdll01.dllとdll01.libができます。

C++で記述された DLL 内の関数に C 言語のモジュールからアクセスするには C リンケージを使って関数を宣言する必要があります。

C リンケージを指定するには、関数の宣言に extern "C" を指定する必要があります。

また、__declspec(dllexport) は、オブジェクト ファイルにエクスポート ディレクティブを追加 するよう指示します。

呼び出し側アプリケーションもC++で書きます。

callmydllというプロジェクトを作りましょう。このディレクトリに先ほど 作ったdll01.hとdll01.libをコピーしておくと便利です。

dll01.libをcallmydllプロジェクトに追加しておく必要があります。(「プロジェクトの設定」 「リンク」で追加できます。)

// callmydll.cpp

#include <stdio.h>
#include "dll01.h"

int main()
{
    int chk;
    char szName[64], szBuf[256];
    
    chk = name_check(szName);
    
    if (!chk) {
        sprintf(szBuf, "Dllを利用してあなたの名前を取得しました。%sさんですね\n", szName);
        printf(szBuf);
    } else {
        printf("名前は取得できませんでした。\n");
    }
    
    return 0;
}
これを実行するには、dll01.dllがcallmydll.exeから見える位置にある必要があります。

では、実行してみましょう。

dll内のname_check関数が呼び出されていますね。



では、呼び出し側プログラムをCで書くとどうなるでしょうか。

ビルドエラーでうまくいきませんね。dll側でCリンケージを使っているので 呼び出し側でわざわざCリンケージにする必要はないのです。

#include "dll01.h"

の一行を削除するとうまくいきます。


[Index] [総合Index] [Previous Chapter]

Update 03/Jan/2004 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。