C++ BuilderからDelphi DLLを呼び出す
C++ BuilderからDelphiのDLLを呼び出すのは、一般的なDLL呼び出しと同じです。以下に例を示します。この例ではWin32 APIのLoadLibraryでDLLをロードしています。
/* C++ Builder 1.0からDelphi 3.1 DLLを呼び出すサンプル */
//---------------------------------------------------------------------------
#include <windows.h>
#include <vcl\condefs.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USERES("DllCall.res");
typedef double (*ROOTFUNC)(double, double);
//---------------------------------------------------------------------------
int main(int argc, char **argv)
{
HINSTANCE hinst = ::LoadLibrary("SampDll.dll");
if (hinst == NULL)
{
puts("LoadLibraryがNULLを返した。");
return -1;
}
ROOTFUNC RootOfEq1 = (ROOTFUNC)::GetProcAddress(hinst, "RootOfEq1");
if (RootOfEq1 == NULL)
{
puts("GetProcAddressがNULLを返した。");
return -1;
}
double ans = RootOfEq1(4.0, -4.0);
printf("Ans = %10.4f\n", ans);
::FreeLibrary(hinst);
getchar();
return 0;
}
//---------------------------------------------------------------------------
Delphi DLLソース
library SampDll;
{ DLL でのメモリ管理について:
もしこの DLL が引数や返り値として String 型を使う関数/手続きを
エクスポートする場合、以下の USES 節とこの DLL を使うプロジェクトソースの
USES 節の両方に、最初に現れるユニットとして ShareMem を指定しなけれ
ばなりません。
これは構造体やクラスに埋め込まれている場合も含め String 型を DLL
とやり取りする場合に必ず必要となります。
ShareMem は共用メモリマネージャである DELPHIMM.DLL とのインターフェース
です。あなたの DLL と一緒に配布する必要があります。
DELPHIMM.DLL を使うのを避けるには、PChar または ShortString 型を
使って文字列のやり取りをおこなってください。}
uses
SysUtils,
Classes;
function RootOfEq1(a, b: Double): Double; stdcall;
begin
Result := - b / a;
end;
exports
RootOfEq1 index 1;
begin
end.