DLLの関数内で、アプリケーションから渡された関数を使用する方法です。
新規ダイナミックライブラリの画面が表示されるので、次のように選択します。
ソースの種類「C++」
マルチスレッド「チェックしない」
VC++スタイルのDLL「チェックしない」
「OK」ボタンを押します。
以上で、プロジェクトが作成されます。
コールバックを行う関数を定義します。
typedef int WINAPI (*TCalcProc)(int);
コールバックを行う関数を引数にとる、エクスポートする関数を作成します。
extern "C" void __declspec(dllexport) Print(TCalcProc CalcProc, int X)
{
…
全体のソースコードは次のようになります。
#include <windows.h>
#include <iostream>
//コールバックを行う関数の定義
typedef int WINAPI (*TCalcProc)(int);
/**
* 計算結果を出力する関数
* @param CalcProc 計算を行う関数
* @param X 計算に使う値
*/
extern "C" void __declspec(dllexport) Print(TCalcProc CalcProc, int X)
{
std::cout << CalcProc(X) << std::endl;
}
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
今回は簡単な静的なロードの方法で作成します。
DLLのプロジェクトをコンパイルすると、libファイルが作成されます。
作成されたlibファイルをプロジェクトに追加します。
DLLのエクスポートする関数を定義します。
#include <windows.h>
//コールバックを行う関数の定義
typedef int WINAPI (*TCalcProc)(int);
//DLLの関数
extern "C" void Print(TCalcProc CalcProc, int X);
コールバックする関数を作成します。
//コールバックを行う関数
extern "C" int WINAPI Treble(int X) { return X * 3; }
DLLの関数を使用するには、コールバックする関数のポインタを渡します。
Print(&Treble, 2);
全体のソースコードは次のようになります。
#pragma hdrstop
#include <tchar.h>
#include <windows.h>
//コールバックを行う関数の定義
typedef int WINAPI (*TCalcProc)(int);
//DLLの関数
extern "C" void Print(TCalcProc CalcProc, int X);
//コールバックを行う関数
extern "C" int WINAPI Treble(int X) { return X * 3; }
extern "C" int WINAPI Quadruplicate(int X) { return X * 4; }
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
Print(&Treble, 2); //=> 6
Print(&Quadruplicate, 2); //=> 8
return 0;
}
Borland C++Builder 6実用プログラミング―オブジェクトとその再利用の方法
C++BuilderによるDLL、VCLパッケージ、COM/ActiveXの利用方法が解説されています。
DLLの利用方法についても、Variant配列やSafeArrayを受け渡しする方法やBDEデータベースハンドルを共有する方法など、非常に専門的な内容を取り扱っています。