Лекция: Системное программирование. Архитектура Windows-программ.
Как известно, все приложения запускаются под управлением ОС, поэтому с позиции прикладной программы ОС Windows представляет собой совокупность системных функций, формирующих интерфейс прикладных программ-Win32 API(Application Programming Interface). Win32 API состоит из функций, структур, констант и сообщений, позволяющих непосредственно создавать приложения Windows и управлять ими. Так, чтобы выполнить те или иные действия (например, открыть окно и отобразить текст или графику), Ваша программа должна обратиться к соответствующим функциям Win32 API напрямую или подключить к проекту элементы ActiveX, взяв их спанели GeneralToolBox,в которых могут встречаться ссылки на функции Win32API. Следует отметить, что прямое обращение к функциям Win32 API увеличивает быстродействиеприложения. Программный код этих функций образует ядро ОС, который слишком велик по объему и не может целиком размещаться в оперативной памяти, поэтому большая часть функций остается на диске в библиотеках динамической компоновки и загружается в память по мере надобности по их вызовам из прикладной программы. Способ загрузки библиотечных функций может быть статическим (в дальнейшем именно с ним нам предстоит работать) и динамическим.
В состав ядра входит более 1000 функций. Основные из них размещены в трех динамических библиотеках: KRNL386.EXE, USER.EXE, GDI.EXE.Ядро MS DOS,как известно, формируется из файлов IO.SYS иMSDOS.SYS.KRNL386.EXEуправляет памятью и загрузкой прикладных программ. USER.EXEсодержит функции создания и управления окнами(перемещение, изменение размеров, удаление), управляет иконками и курсорами, обрабатывает сообщения с клавиатуры, мыши и других пользовательских приложений. Эти функции позволяют приложениям организовать более эффективную обработку событий мыши посравнению с возможностями, предоставляемыми VisualBasic. GDI.EXE(GraphicsDeviceInterface) содержит функции графического вывода.
Единственным отличием API-функций Windows от обычных функций Visual Basic является необходимость объявлять их перед использованием (статическая загрузка) с помощью оператора Declare.По сути, требуется сообщить Visual Basic имя и местоположение DLL-библиотеки(user32.dll, gdi32.dll, kernel32.dll),в которой находится ссылка(заголовок) на API-функцию ядра ОС или описание самой функции. Синтаксис объявления API-функции следующий. [Public| Private] DeclareFunction Имя Функции Lib «Имя Библиотеки» [Alias«псевдоним»] ([Список Аргументов])] [As Type] Объявления API-функций должны размещаться в общей области GDмодуля. Если Вы размещаете его в модуле формы, то обязательно нужно указать ключевое. Слово Private(чтобы данное объявление было доступно только внутри модуля). Это требование касается и всех подпрограмм, размещенных в модуле формы. Набор Win32 API реализован только в виде функций. В большинстве своем это функции типа Long,которые чаще всего возвращают код завершения операции. Причем не нулевоезначение означает нормальное завершение, нулевое-ошибку. В Win32 API чаще всего используется передача параметров по значению (ByVal), то есть выполняется односторонняя передача данных -от VB-программы к API-функции. В качестве типов параметров, кроме известных, могут использоваться и новые.•… As Anyозначает, что в стек будет помещен не который адрес буфера памяти. Тип Anyможет использоваться только в операторе Declare, а Фактический параметр при вызове функции должен иметь конкретный тип.•… As User Defined Typeозначает, что требуется обменяться данными(в обе стороны) с помощью некоторой структуры. Такая конструкция всегда используется без слова By Val, то есть в данном случае выполняется передача по ссылке, то есть в стек записывается адрес переменной. Некоторые API-функции начинаются с символа подчеркивания, что недопустимо для VB. Поэтому для обращения к таким функциям их имя следует указать в поле «псевдонима» за ключевым словом Alias. Вызов API-функции аналогичен вызову любой обычной функции VB, то есть ее можно вызвать операторным(бесскобочным) или скобочным способом.