__stdcall - WINAPI против STDMETHODCALLTYPE против APIENTRY - PullRequest
3 голосов
/ 14 января 2020

Я читаю некоторые из кодов исправлений игры , которые касаются манипулирования памятью для исправления "проблемы" игры. Я обнаружил, что в коде используются 2 макроса , которые WINAPI и STDMETHODCALLTYPE. Все эти макросы оцениваются в __stdcall, который определяет соглашение о вызовах для функции. Я также узнал, что APIENTRY - это еще один псевдоним макроса для WINAPI. Так есть ли различия между этими макросами? Мне кажется, что они просто псевдонимы. Почему их так много?

Ответы [ 2 ]

3 голосов
/ 14 января 2020

Все типы данных и соглашения о вызовах в API Windows определены как псевдонимы (макросы препроцессора или typedef s). Это обеспечивает стабильный ABI, независимо от компилятора или набора инструментов. Это также позволяет изменять ABI, не нарушая существующий код (например, когда была введена 64-битная Windows).

И WINAPI, и STDMETHODCALLTYPE расширяются до одного и того же: __stdcall для x86 и ничего для всего остального. Так зачем тогда 2 псевдонима для одной и той же вещи? Поскольку они управляют соглашением о вызовах для различных подмножеств:

  • WINAPI определяет соглашение о вызовах для плоского C * Windows API.
  • STDMETHODCALLTYPE, on с другой стороны, управляет соглашением о вызовах для COM ( Компонентная объектная модель ).

COM и Windows API независимы. Наличие двух псевдонимов для управления соглашением о вызовах имеет смысл. Вы не захотите ломать все COM, просто потому что вы переходите на новый ABI для Win128.

1 голос
/ 14 января 2020

Потому что в 16-битном формате это были разные соглашения. Начиная с плоского режима x86, все, что связано windows, равно __stdcall (Pu sh справа налево, вызываемый абонент очищает стек). __cdecl, __fastcall также существует.

Начиная с x64, существует практически только один , и все это игнорируется.

То же самое происходит со многими другими Windows элементы, такие как WPARAM и LPARAM. Когда-то WPARAM был 16-разрядным, в x86 они оба были 32-разрядными, а в x64 - 64-разрядными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...