今回は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"
の一行を削除するとうまくいきます。
Update 03/Jan/2004 By Y.Kumei