ac アプリ (VS2008、Win) から、Borland の Delphi で記述された dll 内の関数を呼び出します。関数は機能しますが、呼び出しのたびに次のエラーが表示されます。「関数呼び出しで ESP の値が適切に保存されませんでした […]」。これは、呼び出し規約が間違っていることを意味します。私は Delphi を知りませんし、完全な dll コードも持っていませんが、これは Delphi 関数だと思います:
function translate(file1, file2: PChar):PChar; stdcall;
...
Result:=PChar(c);
end;
exports
translate;
cの関連部分:
typedef char*(__stdcall *translate)(char*, char*);
translate MyTranslate;
...
MyTranslate = (translate)GetProcAddress(dll, "translate");
char* result = (*MyTranslate)(file1, file2);
上記の c の __stdcall の代わりに、__cdecl と __fastcall を試しましたが、常に ESP メッセージが表示されます。また、Dephi 関数コードでは、関数は char* を返すように見えますが、dll ドキュメントには、「true」または「false」(?) を返すと書かれています。したがって、「typedef char * ...」の代わりにcで「typedef BOOL ...」を試しました:それでも、ESPメッセージが表示されます。「Basic Runtime Checks」の下でメッセージを抑制できることはわかっていますが (こちらを参照)、呼び出し構文を正しく取得したいと思います。dll は UPX で圧縮されていますが、関連性があるかどうかはわかりません (前述のとおり、機能自体は動作します)。