C++ BuilderのDLL関数をDelphiから呼び出す
C/C++を使うとPascalより細かな処理をすることができることがあります。C++ Builderで作ったDLLをDelphiから呼び出す例を次に示します。
Func1が呼び出す関数です。
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
// DLL メモリマネージャについて:
//
// パラメータや関数の戻り値として String オブジェクトまたはネストした String
// を含む構造体/クラスを渡す関数を DLL がエクスポートする場合, DLL プロジェク
// トと DLL を使用するすべての EXE プロジェクトの両方にライブラリ BCBMM.LIB
// を追加しなければなりません。これにより, DLL と呼び出し側の EXE の DLL が
// メモリマネージャとして BCBMM.DLL を使うように変更されます。この場合,
// ファイル BCBMM.DLL を DLL と一緒に配布する必要があります。
//
// BCBMM.DLL の使用を避けるには, "char *" または ShortString パラメータを使って
// 文字列のやり取りを行ってください。
//---------------------------------------------------------------------------
USERES("DLL1.res");
//---------------------------------------------------------------------------
extern "C" _stdcall __declspec(dllexport) int func1(int x, int y);
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//---------------------------------------------------------------------------
extern "C" _stdcall __declspec(dllexport) int func1(int x, int y)
{
return x * y;
}
unit Test;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Label3: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function func1(x: Integer; y:Integer): Integer; stdcall; external 'DLL1.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
x, y, z, code: Integer;
begin
Val(Edit1.Text, x, code);
Val(Edit2.Text, y, code);
z := func1(x, y);
Edit3.Text := IntToStr(z);
end;
end.