Visual C++ 2012 で記述されたプログラムがあり、Delphi で記述された関数 (ソース コードはありません) を呼び出そうとしました。Visual C++ のコードは次のとおりです。
int (_fastcall *test)(void*) = (int(_fastcall *)(void*))0x00489A7D;
test((void *)0x12345678);
しかし、コンパイルされたコードでは、実際には次のようになりました。
.text:1000113B mov eax, 489A7Dh
.text:10001140 mov ecx, 12345678h
.text:10001145 call eax
そして、私が例外としているのは:
.text:1000113B mov ebx, 489A7Dh
.text:10001140 mov eax, 12345678h
.text:10001145 call ebx
「fastcall」がパラメータとして EAX、ECX、EDX を使用することは知っていますが、Visual C++ コンパイラが EAX をエントリ ポイントとして使用する理由がわかりません。EAX を最初のパラメーター (12345678h) にするべきではありませんか?
アセンブリ コードで delphi 関数を呼び出そうとしましたが、機能しますが、アセンブリを使用せずにそれを行う方法を本当に知りたいです。
Visual C++ コンパイラに、私が例外としてコードを生成させることは可能ですか? はいの場合、それを行う方法は?