Cで作られたDLLを利用する時の「呼び出し形式」(CDECL)について教えてください。
stdcallでの呼び出しで作られたDLLは実行できるのですが、CDECL形式で作られたDLLの実行ができません。
テストとして二つの引数の値を足して返すCの関数のDLLを以下のように作りました。
DLLのヘッダファイル "DLL_Header.h"
コード:
#define Export extern "C" __declspec(dllexport)
Export long __cdecl func_add( long a, long b );
DLLの関数実装部ファイル
コード:
#include "DLL_Header.h"
// a + bの計算結果を返す。
Export long __cdecl func_add( long a, long b ){
return a+b;
}
以上のCのプログラムを"BCC_DLL.dll"という名前でDLLにコンパイル。
(BCC 5.5/BCC Developer使用)
これを利用するAB側(v4.24)のプログラム
コード:
Declare Function func_add CDECL Lib "BCC_DLL" ( a As Long, b As Long ) As Long
#prompt
Dim a As Long, b As Long
a=1
b=2
Print func_add( a, b )
ただしこれを実行するとABのプログラムがDLLの関数を「参照出来ない」、とエラーとなります。
(「stdcall」での呼び出しに変えると実行できます。)
AB(WinAPI)はデフォルトでstdcallとのことですがCDECL呼び出しを行っているケースもあります。
CDECLでの呼び出しには「Declare Function func_add CDECL Lib ~」というように関数名の後に
CDECLを入れるということなのでとりあえずそう書いてはいるのですが、今のところABからDLL関数を見つけられないようです。
CDECL呼び出しについて、お知りの方がおられましたら教えてください。
(AB4.24
BCC 5.5/BCC Developer)