delphi.gif (306 バイト) C++ BuilderのDLL関数をDelphiから呼び出す


C/C++を使うとPascalより細かな処理をすることができることがあります。C++ Builderで作ったDLLをDelphiから呼び出す例を次に示します。

 

CBuilder.gif (228 バイト) Func1が呼び出す関数です

//---------------------------------------------------------------------------
#include &ltvcl\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;
}

delphi1.gif (322 バイト)

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.