Другие языки программирования и технологии
Как приложение общается с 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, в которой содержится функция.
Как эти DLL вызывают ядро ОС - это тема внутреннего устройства Windows. Программисту не обязательно это знать.
Компилятор не знает, где находятся библиотечные функции. Компилятор видит только заголовочные файлы. Из них он узнаёт о существовании этих функций, об их параметрах и о способе передачи параметров. Для компилятора это внешние функции. Подключение библиотек (в том числе библиотек импорта) - это работа линковщика.
В интернете есть книга
Рихтер Джеффри. Создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows
Там подробно рассказано о способах подключения DLL. И ещё много чего (что я не знаю).
Типичная информация из документации по WinAPI:
Library Kernel32.lib -- библиотека импорта. Через неё подключается DLL
DLL Kernel32.dll -- DLL, в которой содержится функция.
Условная адресация. Обращается по смещению наасколько я помню.
Дмитрий Титовский
То есть в EXE файле дается ссылка на какую-то таблицу методов? А вот, интересно, на какую?
Функции WinAPI в библиотеке WinAPI. Куда они дальше обращаются вряд ли известно это уже внутренняя архитектура ОС. Может это даже каким копирайтом защищено. Но принцип тот же - цепочка библиотек (включая драйверы), вызывающих друг друга.
Есть еще стандартные функции BIOS для работы с железом. Они в справочниках есть. Винда их мало использует, у нее свои драйвера для этого. Но если самому систему писать, то можно использовать для стандартных операций.
Есть еще стандартные функции BIOS для работы с железом. Они в справочниках есть. Винда их мало использует, у нее свои драйвера для этого. Но если самому систему писать, то можно использовать для стандартных операций.
Дмитрий Титовский
Так а как мне узнать, где находятся функции библиотеки WinAPI? Я, например, вызываю SemdMessage - как компилятор узнает, куда надо обращаться?
Похожие вопросы
- Можно ли перекомпилировать приложение Windows?
- На каком языке пишутся приложения для Windows.
- При создании приложения windows на каких языках не придется устанавливать фреймворк?
- Работают ли приложения на .NET медленнее или едят больше памяти, чем приложения под Windows?
- Зачем писать приложения для консоли?
- Вопрос по созданию приложений.
- как в C# используя Windows Forms Application, запомнить положение, рабочего окна приложения, на рабочем столе?
- Почему на Windows 7 не идут 30% приложений и игр на XP все отлично работало стоит ли устанавливать XP Zver сборку
- А зачем пишут на C# приложения работающие только на Windows, когда можно писать на Java кроссплатформенные?
- Выдаёт ошибку. Ошибка при запуске приложения (0xc0000005). Для выхода из приложения нажмите кнопку ОК