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


C++ BuilderからDelphiのDLLを呼び出すのは、一般的なDLL呼び出しと同じです。以下に例を示します。この例ではWin32 APIのLoadLibraryでDLLをロードしています。

 

CBuilder.gif (228 バイト)

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

 

delphi1.gif (322 バイト) 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.