Другие языки программирования и технологии

Как приложение общается с Windows

Смотрите. Я пишу Win32 приложение. Обращаюсь к функциям Win API. Для меня все просто - компилятор сам обеспечивает вызов. Но - суть вопроса - а как компилятор узнает, где живут функции API? Я вижу два варианта - либо есть какой-то фиксированный адрес. Но это вряд ли, в защищенной-то системе. И вторая версия - при запуске Windows передает приложению какой-то указатель. Короче, кто-нибудь знает, как это устроено?
Программа на C/C++ через библиотеки импорта ссылается на стандартные системные DLL Windows. Функции в этих DLL описаны в документации как функции Windows API. Посмотри описание функций в документации, там всегда указана DLL.

Как эти DLL вызывают ядро ОС - это тема внутреннего устройства Windows. Программисту не обязательно это знать.

Компилятор не знает, где находятся библиотечные функции. Компилятор видит только заголовочные файлы. Из них он узнаёт о существовании этих функций, об их параметрах и о способе передачи параметров. Для компилятора это внешние функции. Подключение библиотек (в том числе библиотек импорта) - это работа линковщика.

В интернете есть книга
Рихтер Джеффри. Создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows
Там подробно рассказано о способах подключения DLL. И ещё много чего (что я не знаю).

Типичная информация из документации по WinAPI:
Library Kernel32.lib -- библиотека импорта. Через неё подключается DLL
DLL Kernel32.dll -- DLL, в которой содержится функция.
Владимир Акуленко
Владимир Акуленко
58 065
Лучший ответ
Условная адресация. Обращается по смещению наасколько я помню.
Дмитрий Титовский То есть в EXE файле дается ссылка на какую-то таблицу методов? А вот, интересно, на какую?
Функции WinAPI в библиотеке WinAPI. Куда они дальше обращаются вряд ли известно это уже внутренняя архитектура ОС. Может это даже каким копирайтом защищено. Но принцип тот же - цепочка библиотек (включая драйверы), вызывающих друг друга.
Есть еще стандартные функции BIOS для работы с железом. Они в справочниках есть. Винда их мало использует, у нее свои драйвера для этого. Но если самому систему писать, то можно использовать для стандартных операций.
Дмитрий Титовский Так а как мне узнать, где находятся функции библиотеки WinAPI? Я, например, вызываю SemdMessage - как компилятор узнает, куда надо обращаться?