Ответ 1
Здесь есть мало документированная магия. Давайте посмотрим на функцию WIN32
API
, например RegQueryValueExW
. Он определен в файле winreg.h
следующим образом:
WINADVAPI LSTATUS APIENTRY RegQueryValueExW(...);
Где WIADVAPI
является __declspec(dllimport)
, а APIENTRY
является прозвищем для соглашения об именах __stdcall
. Также обратите внимание, что все функции в заголовке объявлены как extern "C"
. Поэтому, во что бы то ни стало, эта функция должна использовать украшение имен, а ее экспорт DLL должен быть [email protected]
. Тем не менее, когда мы смотрим advapi32.dll
экспорт с использованием команды dumpbin /exports
, мы видим недекорированное имя:
Теперь внимательно рассмотрим файл advapi32.lib
с помощью команды dumpbin /headers advapi32.lib
:
Обратите внимание на спецификатор undecorate
, который позволяет связать украшенное имя с неэкспорированным экспортом. Вы можете добиться того же результата для вашей DLL, используя файл def
с разделом EXPORTS
, содержащий неадресные имена. Для получения дополнительной информации см. эту статью и этот ответ.
Кроме того, все написанное выше допустимо только для приложений x86. Функции C в x64-битовой среде связаны без украшения имени:
Форма украшения для функции C зависит от вызывающего которое используется в его декларации, как показано в следующей таблице. Это также формат оформления, который используется, когда код С++ заявлено, что имеет внешнюю связь "С". Соглашение о вызове по умолчанию __cdecl. Обратите внимание, что в 64-битной среде функции не оформлены.