Адреса функций WinAPI в Delphi и C ++ отличаются, когда не должны - PullRequest
2 голосов
/ 28 февраля 2011

В C ++, если вы пытаетесь получить указатель функции функции Windows API, этот указатель указывает на тот же адрес, который вы получите, если бы использовали GetProcAddress для имени этой функции и соответствующего модуля. Например:

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

будет true. Однако в Delphi это не так. Этот код:

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

Не будет не true, и в моем тесте @MessageBoxA было 0x0040bd18, тогда как эквивалент GetProcAdress вернул то, что сделал аналог С ++ теста 0x7550fd1e.

Итак, теперь мой вопрос: почему?

1 Ответ

6 голосов
/ 28 февраля 2011

Адрес с 0x004 .. является адресом объявления импортированной функции API (в windows.pas для MessageBoxA), чтобы она была статически загружена , следовательно, она, конечно, будет находиться в исполняемый образ (базовый адрес по умолчанию 0x00400000). Фактически вызываемая функция находится в образе библиотеки, загруженной в память этой функции. Вы можете получить базу изображений библиотеки с помощью GetModuleHandle. В вашем случае это, вероятно, будет что-то с 0x75 ... С тестом C ++ вы, вероятно, связываетесь с библиотекой времени выполнения, поэтому функция все равно загружается динамически.

...