2

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 で圧縮されていますが、関連性があるかどうかはわかりません (前述のとおり、機能自体は動作します)。

4

2 に答える 2

0

問題は、Delphi 関数の説明が正しくないことだと思います。あなたができることは、'translate' 関数を __stdcall で正しくマークすることだけです。

この種のエラーは、ある記述に従って COM オブジェクトを呼び出そうとすると、実際には別の記述がある場合に発生します。COM オブジェクトの場合、マシン上に複数のバージョンの COM オブジェクトが存在する可能性があり、誤ったバージョンがロードされるために発生します。したがって、これは dll 地獄のような問題です。

しかし、あなたの場合、Delphi DLL がどこからロードされているかを完全に知っていると思います。したがって、その特定のバージョンの DLL のドキュメントが正しくないと思います。

于 2011-06-16T11:58:03.580 に答える
0

dll が Borlandfastcall(EAX, EDX, ECX)を使用し、コンパイラが Microsoft を使用してfastcall(EAX, EDX)いる場合、ESP レジスタの同期がすぐに失われる可能性があります。

于 2011-07-18T10:24:03.683 に答える