3

申し訳ありませんが、おそらくこれも Delphi プログラマーにとっては簡単なことですが、私にとってはそうではありません。呼び出しているライブラリ関数があり、基本的にスタックを消費します。これは、関数の変数をスタックにプッシュすることによって行われますが、どういうわけか、Delphi は変数をスタックからポップしません。そのため、関数が終了した後、私はどこにも着陸しません。おもしろいことに、パラメータの数だけ「pop eax」を実行でき、それが機能します。何が起こっているのかを明らかにできる人はいますか?作業コードは次のようになります。

function LoadIntoMemory(sdiPath: String): Integer;
var
   retValue: Integer;
begin
  retValue := file_open(PAnsichar(AnsiString(sdiPath)), @filedata, @filedatasize);
   asm
     pop eax
     pop eax
     pop eax
   end;
 end;

前述のように、スタックからポップしないとクラッシュします。

関数自体は C DLL からのもので、次のように静的にリンクされています。

function file_open (filename: PAnsichar; filedata: PPAnsichar; filedatasize: PLongInt): Integer; stdcall; external  'libLib';

動的にリンクしても動作は変わりません。

4

2 に答える 2

3

わかりました、私は今それを持っています。おそらく簡単な RTFM の質問で申し訳ありません。cdecl を使用する必要がありました。stdcall の代わりに。これらすべての Delphi DLL リンク チュートリアルで、どこかに言及されていればよかったのにと思います。

http://docwiki.embarcadero.com/RADStudio/XE4/en/Procedures_and_Functions

于 2013-09-07T21:30:09.780 に答える