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.