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