2

GetProcAddressC++ では、Windows API 関数の関数ポインターを取得しようとすると、そのポインターは、その関数の名前とそれぞれのモジュールで使用した場合に取得するのと同じアドレスを指します。例えば:

&MessageBoxA == GetProcAddress("User32.dll", "MessageBoxA");

でしょうtrue。しかし、Delphi ではそうではありません。このコード:

@MessageBoxA = GetProcAddress('User32.dll', 'MessageBoxA');

ではなくtrue私のテストで@MessageBoxA0x0040bd18、同等GetProcAdressのものがテストの C++ の対応するものを返したのに対し、. でした0x7550fd1e

それでは、私の質問です。なぜですか?

4

1 に答える 1

6

0x004.. のアドレスは、インポートされた API 関数 ( windows.pasfor内MessageBoxA) を静的にロードするための宣言のアドレスです。したがって、もちろん、実行可能イメージ (デフォルトでは 0x00400000 のベース アドレスを持つ) に存在します。呼び出される実際の関数は、その関数が存在するメモリにロードされたライブラリのイメージにあります。ライブラリのイメージ ベースは、 で取得できますGetModuleHandle。あなたの場合、それはおそらく 0x75 の何かになるでしょう... C++ テストでは、おそらくランタイム ライブラリとリンクしているので、とにかく関数は動的にロードされます。

于 2011-02-28T02:30:06.123 に答える