Top / Programming / C++Builder / C++ BuilderでDLLの使い方 / コールバックを行う関数を使用するDLL

コールバックを行う関数を使用するDLL

DLLの関数内で、アプリケーションから渡された関数を使用する方法です。

概要

チュートリアル

DLLプロジェクトの作成

  1. C++Builderのメインメニューから「ファイル」-「新規作成」-「その他」を選択します。
  2. 項目カテゴリの「C++Builderプロジェクト」を選択し、「ダイナミックリンクライブラリ」を選択します。
  3. 「OK」ボタンを押します。
  4. 新規ダイナミックライブラリの画面が表示されるので、次のように選択します。

    ソースの種類「C++」
    マルチスレッド「チェックしない」
    VC++スタイルのDLL「チェックしない」

  5. 「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;
}

アプリケーションプロジェクトの作成

今回は簡単な静的なロードの方法で作成します。

  1. C++Builderのメインメニューから「ファイル」-「新規作成」-「その他」を選択します。
  2. 項目カテゴリの「C++Builderプロジェクト」を選択し、「コンソールアプリケーション」を選択します。

プロジェクトにlibファイルを追加

DLLのプロジェクトをコンパイルすると、libファイルが作成されます。
作成されたlibファイルをプロジェクトに追加します。

  1. C++Builderのメインメニューから「プロジェクト」-「プロジェクトに追加」を選択します。
  2. libファイルを選択してプロジェクトに追加します。

DLLの関数の使用

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;
}

おすすめの書籍

更新履歴