Стандарты win32. Что такое Windows API. Что такое Win32

Введение

Последние 10 лет Windows – самая популярная (91,02% ) операционная система на рынке персональных компьютеров. Операционные системы Windows работают на платформах x86, AMD64, IA-64. Существовали также версии для DEC Alpha, MIPSи PowerPC.

Семейство Windows NT:

Операционные системы этого семейства работали на процессорах с архитектурой IA-32 и некоторых RISC-процессорах: Alpha, MIPS, Power PC (до версии 2000, которая вышла только в версии для IA-32). Windows NT являются полностью 32-битными операционными системами, и, в отличие от версий 1.0–3.x и 9x, не нуждаются в поддержке со стороны MS-DOS.

Windows NT 3.1 (1993)

Windows NT 3.5 (1994)

Windows NT 3.51 (1995)

Windows NT 4.0 (1996)

Windows 2000 (2000) – Windows NT 5.0

Windows XP (2001) – Windows NT 5.1

Windows XP 64-bit Edition (2006) – Windows NT 5.2

Windows Server 2003 (2003) – Windows NT 5.2

Windows Vista (2006) – Windows NT 6.0

Windows Home Server (2007)

Windows Server 2008

Windows 7 (2009) – Windows NT 7.0 (Актуальная версия – 6.1)

В основу семейства Windows NT положено разделение адресных пространств между процессами. Каждый процесс имеет возможность работать с выделенной ему памятью. Однако он не имеет прав для записи в память других процессов, драйверов и системного кода.

Семейство Windows NT относится к операционным системам с вытесняющей многозадачностью, а не к операционным системам реального времени. Разделение процессорного времени между потоками происходит по принципу «карусели». Ядро операционной системы выделяет квант времени (в Windows 2000 квант равен примерно 20 мс) каждому из потоков по очереди при условии, что все потоки имеют одинаковый приоритет. Поток может отказаться от выделенного ему кванта времени. В этом случае, система перехватывает у него управление (даже если выделенный квант времени не закончен) и передаёт управление другому потоку. При передаче управления другому потоку система сохраняет состояние всех регистров процессора в особой структуре в оперативной памяти. Эта структура называется контекстом потока. Сохранение контекста потока достаточно для последующего возобновления его работы.

API (Application Programming Interface – интерфейс прикладных программ) – это множество функций, организованных, обычно, в виде DLL. Функции API позволяют организовать интерфейс между прикладной программой и средой, в которой работает эта программа. Вызов функций API позволяет программе получать доступ к ресурсам среды и управлять ее работой. Как правило, API задает стандарт взаимодействия среды и прикладной программы.

Win32 – это название интерфейса, ориентированного на 32-х разрядные приложения и реализованного на таких известных платформах как Windows 95, Windows 98, Windows NT, Windows CE. Функции, составляющие этот интерфейс, позволяют прикладной программе получать доступ к ресурсам операционной системы и управлять ее работой. Более ранние версии Windows используют интерфейс, известный как Win16. Конечно, не все функции, составляющие интерфейс Win32, реализованы в полной мере на всех платформах, так что вызов одной и той же функции под NT приведет к определенному результату, а под Windows 95 работает как вызов заглушки. Любое из приложений, работающее в среде Windows, прямо или косвенно вызывает функции, входящие в Win32 API.

Функции, составляющие Win32 интерфейс, организованы в виде нескольких динамически подключаемых библиотек (DLL) и исполняемых файлов.

API функции не обязательно входят в состав Win32 интерфейса. Например, MAPI интерфейс (Messaging Application Programming Interface) составляют функции, предназначенные для обработки сообщений электронной почты, TAPI (Telephone API) – функции работы с телефонными сообщениями. MAPI, TAPI, также как и Win32 это некоторый набор функций, задающий определенный стандарт взаимодействия

Функции, образующие API, обычно, организованы в виде DLL – динамически подключаемых библиотеках. Одно из достоинств DLL состоит в том, что, сколько бы приложений (процессов) не работало с функциями одной и той же DLL, код DLLсуществует в единственном экземпляре.


1. Теоретическая часть

1.1 Возможности Win32 для нахождения списка запущенных процессов

программа алгоритм библиотека пользователь

Win32 предоставляет несколько способов перечисления запущенных процессов. К сожалению, нет единого способа, который бы работал на всех Win32-платформах. Программистам приходится комбинировать несколько методов в одной программе, чтобы она работала на всех версиях Windows.

1. Рассмотрим следующие методы:

2. С помощью библиотеки Process Status Helper (PSAPI)

3. С помощью ToolHelp32 API

4. С помощью недокументированной функции ZwQuerySystemInformation

5. Через счетчики производительности

6. С использованием интерфейсов Windows Management Instrumentation

7. Функции интерфейса сокетов

1.2 Использование библиотеки Process Status Helper

Библиотека Process Status Helper, известная также под названием PSAPI, предоставляет набор функций, позволяющих получить информацию о процессах и драйверах устройств. Библиотека поставляется в составе Windows 2000/XP и доступна в качестве устанавливаемой компоненты для Windows NT 4.0.

Для перечисления процессов библиотека предоставляет функцию EnumProcesses, которая возвращает массив идентификаторов запущенных процессов. Ниже приведен текст функции EnumProcesses_PsApi, реализующей перечисление процессов с помощью PSAPI.

Функция EnumProcesses не позволяет узнать, сколько места нужно для того, чтобы принять весь массив идентификаторов. Поэтому мы вызываем ее в цикле, увеличивая размер буфера, до тех пор, пока размер возвращенного массива не будет меньше размера буфера.

Поскольку мы хотим помимо идентификаторов процессов получить и имена процессов, мы должны проделать дополнительную работу. Для каждого процесса мы сначала получаем его описатель (handle) c помощью функции OpenProcess и затем используем функцию ЕnumProcessModules, которая возвращает список модулей, загруженных в адресное пространство процесса. Первым модулем в списке всегда является модуль, соответсвующий EXE-файлу программы. Наконец, мы вызываем функцию GetModuleFileNameEx (которая также является частью PSAPI), чтобы получить путь к EXE-файлу по описателю модуля. Мы используем имя EXE-файла без пути в качестве имени процесса.

Нужно обратить внимание на специальную обработку для двух процессов. Мы вынуждены обрабатывать отдельно процесс бездействия системы (Idle) с идентификатором 0, и системный процесс (System), который имеет идентификатор 2 на Windows NT 4 и 8 – на Windows 2000/XP, потому что OpenProcess не позволяет открыть описатель для этих процессов, возвращая код ошибки ERROR_ACCESS_DENIED.



RTOS складається з ядра, планувальника процесів (process manager) і розширених сервісів на рівні користувача. Як справжня мікроядерного операційна система, QNX Neutrino RTOS реалізує в ядрі ОС тільки найбільш фундаментальні сервіси, такі як передача повідомлень, сигнали, таймери, планування потоків, об"єкти синхронізації. Всі інші сервіси ОС, драйвери та програми виконуються як окремі процеси, які ...

Обеспечения является адекватной решению поставленной в техническом задании задачи. 4. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ПОСТАВЛЕННОЙ ЗАДАЧИ Программная реализация разработанной выше структуры приложения состоит в разработке исполняемого Win32-приложения в среде визуального программирования MS Visual Studio. Проект программного обеспечения состоит из трех классов – CFuzzyApp, CFuzzyDlg, CFuzzy_. В...

Выдачей и приёмом лицензий). В условиях крупных сетей рекомендуется выделение под сервер лицензий отдельного компьютера (или нескольких - для резервирования). 1.1 Архитектура терминальных устройств В компьютерных технологиях трёхуровневая архитектура, синоним трёхзвенная архитектура (по англ. three-tier или Multitier architecture) предполагает наличие следующих компонентов приложения: ...

Доступ, то собственник сервера не идет в милицию, а нанимает хакера и «залатывает брешь» в защите. ГЛАВА 2. УГОЛОВНО-ПРАВОВАЯ ХАРАКТЕРИСТИКА ПРЕСТУПЛЕНИЙ В СФЕРЕ КОМПЬЮТЕРНОЙ ИНФОРМАЦИИ 2.1. Неправомерный доступ к компьютерной информации В статье 272 Уголовного кодекса РФ предусмотрена ответственность за неправомерный доступ к компьютерной информации, охраняемой законом, т.е. информации на...

Реализация Win32 интерфейса (API) в среде ОС реального времени стандарта POSIX


Перевод: А. Николаев
С. Ющенко

Dan Hildebrand
Senior Architect, R&D
QNX Software Systems Ltd.

Введение

Широкое распространение Windows 95 и Windows NT создало спрос на встраиваемые операционные системы реального времени, которые могут приспосабливать для себя исходный код, написанный для Win32 API. В настоящее время, в ответ на это, несколько производителей разрабатывают продукты, которые “грубо” представляют возможности реального времени в Windows NT. К сожалению, Microsoft без особой охоты дает доступ к исходным кодам Windows NT, и, как следствие, эти расширения реального времени выполняются вне операционной системы. Одна из таких реализаций заключается во внедрении “расширений реального времени” непосредственно в слой, отделяющий NT от аппаратной части (NT hardware abstraction layer ) или HAL. Другое дополнение запускает NT как задачу под управлением ОС реального времени, наравне с другими процессами, работающими как отдельные задачи. Оба расширения требуют внесения модификаций в HAL, причем, первое в большей степени, чем второе.

Но существует и другой, совершенно отличный от предыдущего, вариант подхода к этой задаче. Он заключается в реализации Win32 API на ОС, специально созданной для функционирования в реальном масштабе времени, и таким образом, позволяет приложениям Win32 работать в реальном масштабе времени наравне с родными приложениями ОС. В этой статье мы рассмотрим достоинства и недостатки этих вариантов.

Реальное время выполненное внутри HAL

HAL - это нижний уровень программного обеспечения, который соединяет Windows NT с аппаратной частью. Он обеспечивает функции связи с аппаратным обеспечением, такие как прерывания, видео, дисководы и т. д. Модифицируя HAL можно добавить код, который перехватывает прерывание таймера и запускается, в некоторой степени, в реальном масштабе времени.

Так как аппаратные прерывания, в первую очередь, обрабатываются HAL’ом и затем передаются операционной системе, HAL имеет преимущество «первой руки» по отношению к ОС. Вместо того чтобы немедленно передать прерывание, HAL может решить использовать его для управления диспетчером внутри ядра реального времени. В ответ на это, диспетчер может запустить набор резидентных HAL задач в реальном масштабе времени. Так как прерывания не были перехвачены ядром реального времени, они могут быть переданы NT для дальнейшей обработки, и приложения NT могут запускаться в соответствии с тактами CPU, которые больше не заняты задачами реального времени, работающими внутри HAL.

Проблема заключается в том, что эта работа в реальном масштабе времени “невидима” для остальной системы (кроме потерянных на работу ядра реального времени тактов CPU и задач, работающих внутри ядра). А именно, HAL-резидентные задачи реального времени не могут получить прямой доступ к полному сервису, предоставляемому Windows NT (графический интерфейс, дисковые накопители, сеть и т.д.). В результате, разработчики, которые взялись за этот метод, должны найти возможность обеспечения взаимодействия HAL-резидентных задач с приложениями NT, которые могут иметь полный доступ ко всему сервису:

Достоинства и недостатки

При использовании метода, базирующегося на HAL, среда Windows NT модифицируется всего лишь слегка, и это означает для ОС совместимость с драйверами устройств и другими расширениями. Но этот вариант имеет несколько недостатков:

Нет совместимости между стандартной средой и средой реального времени

    Суть в том, что ядро реального времени внутри HAL будет иметь либо совсем небольшой набор функций Win32, либо совершенно другой набор инструментов. И как результат, процессы, требующие исполнения в реальном масштабе времени, должны программироваться совершенно иным способом, чем обычные NT программы. Переносить код между NT и HAL становится затруднительно.

Нестандартная среда разработки

    В связи с различием в структуре и коде приложений, инструменты разработки и отладки приложений реального времени тоже будут отличаться от инструментов для создания обычных приложений. Требуется определенная тренировка перед началом разработки задач реального времени.

Нестабильность

    То, что задачи реального времени работающие в HAL весьма нестабильны в работе, принимается как должное. В то время как среда NT обеспечивает MMU защиту для стандартных задач, ошибки в коде HAL-резидентных приложений реального времени могут легко привести к полному краху NT (“Голубой Экран”). И как результат, среда разработки является довольно хрупкой. Кроме того, приложения реального времени, работающие в HAL, не могут противостоять глобальным сбоям самого NT.

Дополнительные накладные расходы

    Реализация HAL, описанная в прессе, для обработки прерываний в реальном масштабе времени использует метод “опроса прерывания”, который работает на высокой, постоянной частоте (20,000 Hz). Это прерывание с фиксированной частотой, вызывает дополнительные накладные расходы на диспетчеризацию всей системы, обрабатывая прерывание тогда, когда не требуется никакой работы в реальном масштабе времени. Также, увеличивается время ожидания начала работы, так как события реального времени не могут быть обработаны до следующего интервала опроса. Настоящее ядро реального времени управляется событиями, немедленно отвечая на прерывания в момент их возникновения.

Большие требования к памяти

    Использование расширения HAL только добавляет и без того большие требования NT к памяти. В результате, это решение остается неудовлетворительным для многих систем реального времени с ограниченными ресурсами памяти, которые могли бы извлечь пользу из интерфейса Win32.

Реализация реального времени вне Windows NT

Второй вариант добавления возможностей реального времени в Windows NT - это запуск NT как задачи с самым низким приоритетом под управлением ОС реального времени. Так как остальные задачи могут работать с более высоким приоритетом, чем NT, они могут приостановить выполнение NT и достигнуть лучшего детерминизма реального времени. Для большей надежности, эти задачи работают в адресном пространстве отдельном от NT:

К сожалению, этот метод разделяет многие из основных недостатков метода HAL-расширения, описанного выше. Разработчик должен, как и раньше, работать с двумя абсолютно различными интерфейсами и выбирать между ними, в зависимости от того, требуется ли ему детерминизм реального времени или нет. Инструменты разработки для этих приложений в значительной степени различны. Перенос исходных кодов между этими средами весьма сложен. И опять таки, требование к объему памяти для этой среды значительно выше, чем просто к Windows NT.

Несмотря на недостатки обоих методов, появление возможности добавить, в некоторой степени, поддержку реального масштаба времени в стандартный Windows NT имеет положительную сторону - в особенности то, что совместимость с Windows NT в основном сохраняется. Тем не менее, так как оба метода добавляют собственные интерфейсы, они сводят на нет дух цельной среды “открытой системы”, которая бережно создавалась в течение нескольких последних лет.

Вместо того чтобы брать ОС (Windows NT), исходные коды которой не доступны, и пытаться добавить в нее возможности реального времени, намного лучше заставить работать приложения Win32 на ОС, специально созданной для работы в реальном масштабе времени. Пример такого метода - это реализация инструментального пакета Willows Win32 в среде операционной системы QNX ® , построенной на базе микроядра.

Добавление Win32 API в ОС реального времени.

В попытке ввести в мир Win32 те полезные возможности, которые POSIX внес в окружение систем UNIX, Европейская Ассоциация Производителей Компьютеров (European Computer Manufacturers Association или ECMA) утвердила Интерфейс Программирования Приложений для Windows (Application Programming Interface for Windows или APIW). Так же как группы стандартов POSIX определили POSIX исключительно в пределах интерфейса, а не в пределах реализации, так и ECMA вместе с OSF определили стандарт APIW. Назначение APIW - определить стандарт интерфейса Win32 для разработки в открытых системах кросс платформенных программ, которые не обязательно должны работать только в операционных системах, зависящих от Microsoft или Intel.

ОС QNX подтверждает состоятельность этого “независимого от реализации” метода: это высокопроизводительная ОС на базе микроядра, которая также поддерживает интерфейс стандарта POSIX. Как и POSIX API, APIW, определенный ECMA, может быть принят QNX, позволяя ОС обеспечивать высокопроизводительную платформу реального времени для работы приложений, написанных для Win32 API. Такой подход устраняет множество недостатков, описанных для двух предыдущих методов:

Устойчивая среда

    QNX представляет модель среды исполнения, по крайней мере, такой же степени надежности, как и Windows NT, с процессами, выполняющимися в отдельных MMU-защищенных адресных пространствах. И как результат, среда реального времени, которую QNX предоставляет для Win32 программ, более “жесткая” чем среда, в которой выполняются HAL- резидентные задачи без защиты памяти:

Совместимость стандартной среды и среды реального времени

    Приложения реального масштаба времени могут быть написаны с полной поддержкой Win32 API, включая доступ к графическому интерфейсу. Это намного предпочтительнее, чем иметь только ограниченный API внутри HAL или собственный API, управляемый ОС, которая запускает NT как задачу. Разработчикам не нужно изучать новый набор функций и средства разработки, и уже существующий исходный код Win32 может быть немедленно откомпилирован и запущен в среде реального времени.

Нет накладных расходов

    QNX, как событийно-управляемая ОС реального времени, не нуждается в опросе этих событий. ОС отвечает на аппаратные прерывания только тогда, когда они происходят, запуская обработчик прерываний и распределяя процессы, затрачивая на это минимум времени, как это и свойственно ОС реального времени. Таким образом, исключаются излишние задержки и дополнительные затраты ресурсов, связанные с опросом событий реального времени.

Компактная платформа

    Реализация Win32 API в QNX, выражается в том, что среда исполнения получается компактнее, чем Windows 95, и значительно компактнее, чем Windows NT. Несмотря на свою компактность, эта среда обеспечивает устойчивость полной защиты памяти, в дополнение к детерминизму реального времени, поддержке Win32 API и POSIX API. Это удовлетворяет встраиваемые в ПЗУ или в flash-память системы намного больше, чем настольные ОС типа Windows NT.

Эта среда дает дополнительную выгоду: благодаря совместимости QNX со стандартами POSIX и UNIX, исходный код UNIX систем может быть также откомпилирован и запущен. Перенос исходных кодов UNIX на QNX платформу требует такой же объем затрат, как и перенос исходных кодов между разными версиями UNIX от разных производителей. В результате, разработчики системы реального времени могут спокойно переносить исходный код как из мира Win32, так и из мира UNIX прямо в свою среду реального времени. Это минимизирует объем кода, который должен быть написан с нуля, и что более важно, помогает сократить время выхода продукта на рынок.

Реализация Win32 API в QNX

Для реализации Win32 API в ОС QNX, Willows Software () и QNX Software Systems перенесли пакет Willows RT в QNX и добавили оптимизацию для QNX, для лучшей работы окружения Willows. Этот пакет работает как независимый от платформ интерфейс между приложениями, вызывающими Win32 API и основной операционной системой. С точки зрения прикладных программ, этот интерфейс, выполненный как разделяемая библиотека, выступает в виде оперативной среды Windows со всеми ее возможностями и функциями, которые программа ожидает увидеть. С точки зрения разработчика, нет необходимости овладевать новой средой для рекомпиляции существующих приложений Win32.

Willows RT изначально был разработан как Willows Toolkit для X Window System for Unix и для графической среды Macintosh. Несмотря на то, что существует реализация X Window для QNX, работа Willows RT под X в среде QNX не удовлетворила бы требованиям компактности для рынка встраиваемых систем реального времени. Итак, Willows RT был перенесен в оконную систему на базе микроядра - Photon microGUI ® , которая работает в среде QNX (смотрите Error! Reference source not found. для более подробной информации). Photon может выполнять те же функции, что и X Window, но занимает меньший объем памяти (около 500Кб). Наряду с маленьким размером самой QNX, он открывает новое решение - Willows-на-QNX, которое требует намного меньше памяти, чем Windows NT и дает возможность работать приложениям Win32 в реальном масштабе времени.

Компоненты Willows API

В Willows API входят 3 основные компоненты:

  • бинарный интерфейс Willows (Willows Binary Interface)
  • библиотека Willows (Willows Library)
  • уровень абстракции платформы Willows (Willows Platform-abstraction Layer)

Бинарный интерфейс Willows

Приложения Win32 взаимодействуют с библиотекой Willows таким же образом как и со средой Windows: вызов функций API, прием сообщений, загрузка ресурсов и даже запуск других приложений Win32. Существующие приложения Win32 и динамические библиотеки (DLLs) для доступа к Win32 API на не-Intel платформах взаимодействуют с бинарным интерфейсом Willows. (Этот интерфейс перенаправляет все запросы Windows API к библиотеке Willows, чтобы дать возможность инородным приложениям достигнуть скорости функционирования как на родной платформе.) Подобным же образом, библиотека Willows взаимодействует с областью драйверов, создавая запросы к графическим, оконным или системным операциям и принимая ответы или асинхронные сообщения.

Willows API может опознавать 16-ти разрядные Intel объекты, такие как динамические библиотеки (DLL), директивы Visual Basic (VBX), драйверы (DRV) и пользовательские средства управления произведенные “третьими фирмами”. Следовательно, разработчики могут совмещать в прикладной программе исходные коды и бинарные модули. Также, они могут переносить свои приложения, не дожидаясь, когда кто-нибудь из “третьих фирм” перенесет свои библиотеки. Файлы данных и графические файлы могут также использоваться без всяких изменений и программы могут продолжать загружать данные из DLL без каких-либо модификаций, что ускорит продвижение продукта на рынок.

Виртуальная Машина

    Виртуальная Машина обеспечивает слой абстрагирования от аппаратного обеспечения, который имитирует работу Intel процессора в защищенном режиме. Этот слой управляет сегментами кода и данных, регистрами Intel, управлением прерываний, инструкциями и имитацией ввода/вывода. Все исходные адреса отображаются в адреса в формате сегмент/смещение, включая адреса данных и адреса функций окна Windows API.

    Для переноса Willows RT в QNX, для которой Intel процессор является родным, такая адаптация к аппаратному обеспечению не нужна. В результате этого, родной код Wn32 может работать с требуемой скоростью, не зависимо от того, производился ли перенос исходного кода Win32 или изменилась среда функционирования DLLs, для которых исходный код не доступен. Такое естественное выполнение сохраняет способности программ достигать производительности реального масштаба времени на ОС QNX.

Эмулятор DOS

    Эмулятор DOS имитирует прерывания и функциональный интерфейс DOS. Сюда включены все функции DOS, используемые Win32 API, включая управление процессами и операции ввода-вывода. Доступ к параллельным и последовательным портам производится путем отображения функций непосредственно на устройства или фильтры вывода.

    QNX поддерживает доступ к родным носителям информации DOS, которые Willows RT использует, чтобы читать и записывать файлы на такие носители как жесткие и гибкие диски. В результате, файлы могут спокойно перемещаться между системами QNX/Willows и родным окружением Windows/DOS. Сетевые соединения через TCP/IP c SMB (или CIFS) и NFS могут также использоваться для совместного использования сетевых файлов между системами QNX/Willows и Windows95 или Windows NT.

16/32-х битный Обработчик запросов

    16/32-х битный Обработчик запросов (16/32 Thunking Layer) манипулирует запросами между 16-битовым кодом Windows и библиотекой Willows. 16-битовый код работает в защищенном режиме, используя 16-битовый стек и сегмент/смещение для адресации. Каждый запрос идентифицируется “методом”, который обрабатывает соответствующий тип запроса. Данный метод может варьироваться от чего-нибудь простого, вроде таких как запрос к библиотеке и возвращение результата в определенных регистрах, до более сложных операций, которые преобразуют адреса и структуры данных в обоих случаях, как во время вызова, так и в момент возврата из процедуры.

16/32-битный Загрузчик

    16/32-битный Загрузчик загружает программы, производит распределение кода и данных программ, динамических библиотек и драйверов. Загрузчик работает совместно с виртуальной машиной и обработчиком запросов, для размещения сегментов кода и данных, включая отсутствующие сегменты, которые будут загружены в дальнейшем по запросам приложений. Загрузчик также связывает библиотеку Willows с DLL для переназначения вызовов к библиотеке.

Библиотека Willows

Для реализации Microsoft Windows API, библиотека Willows была сделана независимой от платформы, отделяя зависящий от платформы код от самой библиотеки, и помещая его на более низкий уровень абстрагирования от платформы. Для полной гарантии независимости от платформы, библиотека была написана с помощью самого Win32 API; это сократило до минимума число функций, которые необходимо поместить на уровень абстрагирования от платформы. В результате, библиотека Willows остается совместимой со многими платформами, компилируясь как родной код для каждой из платформ, для достижения максимальной эффективности.

Реализация библиотеки Willows согласована и совместима с требованиями APIW, введенного ECMA и OSF как кросс платформенный Windows API. Она написана на языке C и обеспечивает доступ как из программ, написанных на C, так и на C++.

Все наиболее часто используемые функции Windows API, за исключением специфических функций запуска двоичных программ, реализованы в Бинарном Интерфейсе. Он включает все стандартные функции управления и классы, такие как классы типов и сообщений.

Библиотека поддерживает:

  • окна MDI, общие диалоги и функции управления диалогами
  • реализацию многозадачности внутри одного процесса
  • буфер обмена (clipboard) и динамический обмен данными (DDE)

Библиотека сохраняет свойства каждого окна, и управляет локальными и глобальными атомарными таблицами. Она также имеет доступ к собственным и бинарным ресурсам, которые могут быть динамически загружены и выгружены под управлением прикладной программы.

Эта среда также добавляет в Windows API полный набор функций конфигурации и отладки. Работая с версией библиотеки, предназначенной для отладки, прикладная программа может проследить выполнение каждого API и получить диагностическую информацию о программе, во время ее выполнения. Встроенный в библиотеку отладчик может работать самостоятельно или с обычными отладчиками для получения детальной информации в реальном масштабе времени о состоянии программы.

Уровень абстрагирования от платформы

Этот уровень содержит весь зависящий от платформы код для создания и управления окнами, отображения в этих окнах, и доступа к системно-зависимым ресурсам. Он содержит три подсистемы, которые доступны через вызовы библиотеки Willows:

Интерфейс администратора окон

    Интерфейс администратора окон позволяет библиотеке управлять - в независимом от платформы стиле - всеми окнами, которые создает прикладная программа. Он управляет такими функциями как создание и удаление окон, смена размера и перенос окон, создание и обслуживание меню управления окна, установка заголовков и иконок для минимизированных окон.

    Вся связь с менеджером рабочего стола (desktop window manager) производится кодом, приспособленным для конкретной платформы, который затем переправляет информацию независимой от платформы части администратора окон. Большинство внешних событий, доступ к которым из графических программ обеспечивает Photon, также перехватываются на этом уровне и преобразуются в стандартный набор команд, которые может обрабатывать библиотека. К таким событиям относятся сообщения о создании, перерисовке и удалении окон и сообщения о местоположении и размере окон.

Интерфейс графических устройств

    Интерфейс графических устройств (Graphics Device Interface) обеспечивает средства для вывода изображений непосредственно в окна или на принтеры. Он поддерживает основные графические операции, такие как рисование линий, прямоугольников и эллипсов, а также более сложные операции над объектами, такими как перо, кисть, регион и графический образ. Он также имеет полный набор функций для вывода текста, от выбора шрифта и цвета до специальных эффектов, таких как подчеркивание и перечеркивание. Библиотека Willows и Интерфейс Графических Устройств поддерживают широкий спектр устройств, от простейших с малой разрешающей способностью и ограниченной цветовой гаммой, до дисплеев с высокой разрешающей способностью и большим количеством цветов, а также большой набор принтеров. Все эти услуги отображаются непосредственно на средства, предоставляемые Photon microGUI.

Интерфейс системных услуг

    Интерфейс системных услуг (System Services Interface) обеспечивает зависимый от платформы код для доступа к средствам файловой системы, распределения памяти, сетевого взаимодействия и доступа к устройствам. Например, он перекладывает все запросы, связанные с работой в сети и коммуникациями на соответствующие функции, предоставляемые операционной системой QNX. Он также поддерживает функции межзадачного обмена (IPC), такие как clipboard и DDE, реализованные в библиотеке Willows. Кроме того, он содержит зависимый от платформы код, ассоциируемый с динамическими библиотеками, и позволяющий библиотеке окон Willows (Willows Window Library) поддерживать в QNX семантику динамически загружаемых библиотеки.

Взаимосвязь между платформами Win32

Так как Вы можете спокойно переносить приложения Win32 между Windows и QNX, то становится относительно просто создавать распределенные системы реального времени, где каждый узел в сети может работать под управлением той ОС, которая в большей степени удовлетворяет желаниям пользователя, но где все узлы используют один и тот же API и коды прикладных программ. Конечно, теперь, когда программа, построенная из одних и тех же исходных кодов Win32, может работать в различных операционных системах одной локальной сети, становится важным обеспечение взаимосвязи этих распределенных программ. Отвечая этому требованию, QXN поддерживает сетевые файловые системы SMB (CIFS) и NFS. Более того, Photon microGUI дает Вам возможность просматривать и управлять экраном узла QNX (или окном конкретного приложения) с экрана Windows 95 или Windows NT. В результате, графические приложения реального времени могут работать на платформах жесткого реального времени, а отображаться на обычных системах, подключенных к сети.

Дополнительные услуги QNX

Как ОС реального времени на базе микроядра, QNX предлагает приложениям Win32 набор услуг, не доступных в Windows NT. Сюда входит устойчивое быстродействие в реальном масштабе времени, распределенная обработка данных и отказоустойчивая сеть.

Распределенная обработка, наследуемая от QNX, позволяет Вам строить приложение как группу взаимодействующих процессов. Без изменения исходного кода эти процессы могут распределяться на несколько процессоров и продолжать работать как раньше. Более того, процесс может использовать любые ресурсы на любом узле QNX в локальной сети, как если бы эти ресурсы находились на локальном компьютере.

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

Заключение

Очевидно, методы HAL-расширения и управляющей ОС предлагают работоспособные варианты добавления возможностей реального времени в NT, но за определенную цену. Они заставляют разработчиков работать с дополнительными, доморощенными API и нестандартными средствами разработки. Они запускают задачи реального времени в относительно неустойчивой среде. К тому же, они увеличивают требования к памяти, которые у NT и без того не маленькие.

С другой стороны, реализация Win32 API на ОС реального времени QNX, позволяет разработчикам использовать только один API - Win32. Это позволяет процессам реального времени работать в надежной, отлаженной среде. И, благодаря малой требовательности QNX к объему оперативной памяти, появляется возможность использовать Win32 для небольших встраиваемых систем.

Как тщательно продуманная ОС реального времени, оптимизированная для использования в критичных к сбоям приложениях, QNX также предлагает разработчику дополнительные возможности - такие как отказоустойчивость сети, распределенная обработка информации и полная совместимость с POSIX и UNIX, что практически не возможно в NT. Более того, QNX делает относительно простым объединение платформ Win32, которое дает разработчику свободу выбора соответствующей ОС для каждой задачи. И в конечном итоге, разработка Willows/QNX представляет объединение менталитета “отрытых систем” и стандартов переносимости исходных кодов.

QNX и Photon microGUI являются зарегистрированными торговыми знаками QNX Software Systems.
Все другие торговые знаки и зарегистрированные торговые знаки принадлежат соответствующим владельцам.

Русский справочник по Win32 API

От изготовителя fb2.

Данная книга (кроме всего прочего) содержит таблицы, к сожалению не все читалки могут их воспроизводить.

Давайте, протестируем вашу читалку.

Если, вместо симпатичной таблицы вы увидели такое:

1 строка, 1 столбец

1 строка, 2 столбец

1 строка, 3 столбец

2 строка 1 столбец

2 строка 2 столбец

Значит ваша читалка таблиц не видит, что очень жаль, т.к. в книге их 49.

Что делать?... Ну, я поступаю так. В Mozilla Firefox поставил плагин для чтения fb2, и все проблемы решены, конечно, возможны и другие варианты...

Вот и все.

Успехов w_cat.

Из книги Журнал «Компьютерра» № 24 от 27 июня 2006 года автора Журнал «Компьютерра»

ОГОРОД КОЗЛОВСКОГО: Русский акцент Автор: Козловский ЕвгенийЭтот «Огород» - чисто публицистический. Без какого бы то ни было касательства к новинкам hi-tech. Впрочем, именно одна из таких новинок спровоцировала издевательскую катавасию, которую я намерен здесь описать, -

Из книги Microsoft Office автора Леонтьев Виталий Петрович

«РУССКИЙ ОФИС» – ПОЛЕЗНЫЕ ДОПОЛНЕНИЯ …Как известно, абсолютно идеального комплекта программ в природе не существует. И как бы ни был талантлив и мастеровит Microsoft Office, он умеет далеко не все. Но, к нашему счастью, этот пакет программ отличается не только умом и

Из книги Язык программирования С# 2005 и платформа.NET 2.0. автора Троелсен Эндрю

Подход C/Win32 API Традиционно разработка программного обеспечения для операционных систем семейства Windows предполагает использование языка программирования C в сочетании с Windows API (Application Programming Interface – интерфейс программирования приложений). Несмотря на тот факт, что в

Из книги Журнал PC Magazine/RE №08/2009 автора Журнал «PC Magazine»

Заголовок Win32 Заголовок Win32 декларирует, что компоновочный блок может загружаться и управляться средствами операционных систем семейства Windows. Данные этого заголовка также идентифицируют тип приложения (консольное, с графическим интерфейсом или библиотека

Из книги Цифровой журнал «Компьютерра» № 26 автора Журнал «Компьютерра»

Выполнение традиционных процессов Win32 Понятие "процесс" существовало в операционных системах Windows задолго до появления платформы.NET. Упрощенно говоря, термин процесс используется для обозначения множества ресурсов (таких, как внешние библиотеки программного кода и

Из книги Ощупывая слона [Заметки по истории русского Интернета] автора Кузнецов Сергей Юрьевич

Русский Android Компания «Вобис» выпускает коммуникатор на базе Google Android. Модель Highscreen PP5420 построена на процессоре Qualcomm MSM7201А (528 МГц), оснащена 128-Мбайт ОЗУ, 256-Мбайт ПЗУ, 3-дюйм сенсорным экраном с разрешением 240?400, GPS, датчиком пространственных перемещений G-Sensor – все вполне в

Из книги 10 простых и легких способов моментального повышения прибыльности любого коммерческого сайта автора Дин Терри

Вирус Win32/Stuxnet: заплат для Windows XP не будет Игорь Осколков Опубликовано 20 июля 2010 года На днях корпорация Microsoft подтвердила наличие уязвимости «нулевого дня» во всех версиях Windows - от 2000 до 7. Причём уязвимость оказалась очень необычной. Началось всего

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Александр Матросов (ESET) о вирусе Win32/Stuxnet Крестников Евгений Опубликовано 21 июля 2010 года Вирус Win32/Stuxnet интересен, прежде всего, своим механизмом распространения, использующим уязвимость в операционных системах Windows: специально сформированный

Из книги Технология XSLT автора Валиков Алексей Николаевич

Из книги Ководство автора Лебедев Артём Андреевич

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

ГЛАВА 1 Знакомство с Win32 и Win64 В этой главе вы познакомитесь с семейством операционных систем (ОС) Microsoft Windows и интерфейсом прикладного программирования (Application Programming Interface, API), который используется всеми членами этого семейства. Здесь также кратко описывается новейший

Из книги Виртуальная библиотека Delphi автора

Архитектура системы управления памятью в Win32 и Win64 Win32 (в данном случае различия между Win32 и Win64 становятся существенными) - это API 32-разрядных ОС семейства Windows. "32-разрядность" проявляет себя при адресации памяти тем, что указатели (LPSTR, LPDWORD и так далее) являются 4-байтовыми

Из книги автора

Переводы стандартов на русский язык? http://www.rol.ru/news/it/helpdesk/xml01.htmРасширяемый язык разметки (XML) 1.0 (вторая редакция). Перевод Радика Усманова, Luxoft (IBS).? http://www.rol.ru/news/it/helpdesk/xslt01.htmЯзык преобразований XSL (XSLT). Версия 1.0. Перевод Радика Усманова, Luxoft

Из книги автора

Из книги автора

О научном редакторе перевода на русский язык Кузьменко Дмитрий занимается проектированием и разработкой приложений баз данных уже 16 лет. С InterBase начал работать в 1994 году. В 2002 году Дмитрий основал фирму iBase (www.ibase.ru), которая занимается техническим сопровождением InterBase и

Из книги автора

Программирование на основе Win32 API в Delphi 1. Введение Любую современную программу или программную технологию можно представить как совокупность программных "слоев". Каждый из этих слоев производит свою собственную работу, которая заключается в повышении уровня абстракции

Все программы Win32 имеют схожий интерфейс: окно с заголовком, границами, системным меню, кнопками “закрыть”, “свернуть” “развернуть/восстановить” и рабочей областью. Окно можно переместить мышью, потянув за заголовок, можно изменить его размеры, перемещая границы. Рабочая область часто содержит меню, панель(и) инструментов. ОС работает с ресурсом через его объект, а пользователь работает с окнами.

    Приложения

    Работа с окном

  • Работа в окне

Оснастка – ПО, устанавливаемое в комплекте с ОС. В нее входит рабочее окно – desktop: кнопка Start, My Computer, Recycle Bin, My Documents… Также устанавливается дополнительный набор программ – notepad, paint, explorer, find, служебные программы (scandisk, defrag, system information), …

    Работа с оборудованием. Профили оборудования.

Control Panel Device Manager (Диспетчер устройств)

Свойства (общие, драйвер, ресурсы), добавить , удалить .

Control Panel Мастер установки оборудования

Все устройства делятся на наследованные (автоматически не распознаются), PnPработают не полностью,PnPполностью работают. Устройство,BIOSи ОС должны поддерживатьPnP, иначе устройство не будетPnP.

ControlPanelУстановка принтера

Сначала установить ПО, потом принтер, либо установить драйвер без присутствия принтера.

ControlPanelSystemПрофили оборудования

Профили оборудования помогают ускорить работу. Вступают в силу после перезагрузки.

    Пользовательские настройки среды Windows. Профили пользователя.

ControlPanelPasswords

Можно установить один профиль для всех пользователей

ControlPanelUsers

В профиль пользователя входят:

  • Избранное

    Звуковое сопровождение

    Language и International Standards

Единица размера (кегля) – пункт – 1/32 дюйма, ~0.36 мм. Шрифты из одного семейства различаются какими-либо параметрами. Они бывают пропорциональными и непропорциональными.Кернинг – размещение букв таким образом, чтобы расстояние между ними казалось одинаковым.

Эффекты – Bold , Italic , Underlined , Strike out …

Типы шрифтов Microsoft:

    Битовые (растровые) FON

    Векторные FON(Используются геометрические единицы)

    TrueTypeTTF(Используются математические формулы)

Кроме того:

    PostScriptработают быстро, но для каждого параметра нужен свой растр (Mac,Adobe)

  1. Настройка производительности среды Windows.

      Видеосистема

Уровень использования аппаратного ускорения

Разрешение экрана

Рисунок на рабочем столе, различные эффекты

      Файловая система

ControlPanelSystemПроизводительность

Настройка кэша на чтение и запись.

Имена в формате 8.3

Дефрагментация диска

      Печать

ControlPanelPrinter

Печатать после загрузки одной страницы или всего документа

      Виртуальная память

ControlPanelSystemПроизводительность

Файл подкачки – для памяти, вытесняемой из RAM. Авто-выбор зависит от размера свободно пространства.

  1. Характеристика приложений. Поддержка приложений Win32.

Win32,Win16,DOS16 – три вида приложений. Все программыWin32 выполняются в одной виртуальной машине.

Приложения Win32:

Формат EXEPE

Стандарт API(стандартные средства интерфейса и функции ядра)

Поддержка работы в сети

Поддержка механизма OLE(хранение объектов различных приложений в одном документе,OLEпривязано к структуре каталогов, следовательно, плохо переносимо)

Поддержка P&P

Стандартная установка и удаление

Win32 API (Application Program Interface) используется для расширения возможностей разрабатываемого приложения VBA. Средства Win32 API, применяемые как в приложениях Windows, так и в самом Windows 95/98 или Windows NT, можно использовать в разрабатываемой программе. Эти средства имеют большие различия друг от друга: одни задают поведение операционной системы, а другие просто подают звуковой сигнал. При использовании функций Win32 API требуется особая осторожность: при неправильном применении подпрограммы API. возникает сбой работы приложения VBA или даже Windows.

Основные вопросы:

Что такое Win32 API

Описание функций Win32 API

Программирование Win32 API с помощью VBA

Использование Win32 API

ЧТО ТАКОЕ WIN32 API?

API (Application Programming Interface) - интерфейс программирования приложений и всегда связан с другим приложением. Например, Microsoft Excel, Lotus Organizer и множество других приложений имеют API. Pазработчики программного обеспечения не покупают программный интерфейс, они строят его при создании приложений.

API позволяет внешним программам обращаться к программе, в которой имеется API. Таким образом, можно получить доступ из одной программы к средствам другой с помощью API основного приложения. Разрабатывая API, программист обеспечивает другим разработчикам возможность применения средств создаваемого приложения без использования его интерфейса.

Однако API используется не только внешними приложениями. Множество больших приложений используют API, чтобы обеспечить связь одной их части с другой. Создавая в таких приложениях вспомогательные функции и обращаясь к ним с помощью программного интерфейса, можно упростить разработку всего приложения.

Рассмотрев, как используется API, требуется описать, что такое API? API - это обычно не более чем просто набор функций, с помощью которых можно обратиться к средствам разрабатываемого приложения. Программа, реализующая API, часто занимает не больше 10 или 20 процентов всего приложения, однако, она должна обеспечивать доступ к 100 процентам функций этого приложения.

Win32 API идеально подходит под это описание: он обеспечивает доступ практически ко всем функциям Windows 95/98 и Windows NT. Win32 API помогает Windows 95/98 и Windows NT управлять памятью, различными устройствами, например принтером, обрабатывать события, рисовать на экране диалоговые окна и т. д.

Кроме того, Win32 API поддерживает связь одного приложения с другим. Например, большая часть Windows 9х является встроенной поддержкой сетей. Конечно, эта часть должна также выводить диалоговые окна, отображать сообщения и управлять памятью. В ней используются функции API, которые можно применять в разрабатываемом приложении VBA.

Во многих программах, например, Microsoft Excel и Lotus cc:Mail, также используется Win32 API. Если приложению или модулю Windows 9х или Wiindows NT требуется некоторое средство, то обычно вызывается функция Win32 API.

Использование библиотек динамической компоновки

Win32 API оформлен в виде библиотек динамической компоновки. В этих библиотеках хранятся все средства, к которым требуется обеспечить доступ в других приложениях. Библиотеки динамической компоновки получили такое имя благодаря тому, что приложения подключаются к ним во время выполнения и используют их функции.

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

Одни файлы библиотек динамической компоновки имеют расширение DLL, другие - расширение ЕХЕ. Следующие файлы составляют большую часть Win32 API:

При программировании приложений VBA с использованием Win32 требуется работать с функциями, которые находятся в вышеприведенных файлах.

Когда нужно использовать Win32 API?

С помощью Win32 API можно использовать в разрабатываемом приложении не только средства VBA или основного приложения, но и те же фунции, что применяет Windows 9х или Windows NT. Эти средства позволяю пример, управлять памятью или создавать диалоговые окна для установки системного времени. Хотя в проекте VBA обычно используется только процент функций Win32 API, однако доступны практически все 100 процентов.

Win32 АPI включает более 1500 функций, поэтому здесь невозможно описать каждое средство. Вместо этого приводится классификация функцией API:

Управление Windows. Данная группа функций управляет рисованием окон на экране, а также обрабатывает нажатия клавиш и действия мышью при работе с окнами.

Элементы управления Windows. Данная группа функций управляет инструментами управления, используемыми в приложениях Windows, например, полями, кнопками и списками, а также стандартными диалоговыми окнами, такими как диалоговые окна "Открытие файла" и "Печать".

Настройка. Данная группа функций наиболее часто используется VBA. Эти функции позволяют воспользоваться средствами, которые содержатся на Панели управления. Например, можно использовать инструменты установки программ, а также работать с командной строкой и средством уплотнения файлов.

Графические средства. Win32 API включает большое количество функций, которые управляют графическими элементами окон приложений и самой операционной системой. Данная группа включает базисные функции, которые управляют рисованием точек на экране, а также цветом и печатью.

Системные средства. Данная группа функций управляет памятью, питанием компьютера, правами доступа к файлам, обменом данными между приложениями, системным временем и рядом других средств Windows.

Языковая поддержка. Данная группа обеспечивает языковую поддержку для Windows 9х, Windows NT и их приложений.

Сетевые средства. Данная группа функций обеспечивает сетевую поддержку, включая создание соединений, получение информации о пользователях и правах доступа, а также отсоединение от сервера.

Подробную информацию о группах и функциях Win32 API смотрите в руководстве по Win32 SDK, которое поставляется Microsoft.

ПРОГРАММИРОВАНИЕ WIN32 API В VBA

Описание подпрограммы

До использования функции или подпрограммы Win32 API, необходимо объявить ее в разделе описаний любого модуля. При этом можно создать отдельный модуль, в котором хранятся только описания. Если проект VBA держит ряд подпрограмм Win32 API, то полезно сгруппировать все описания, а также объявить используемые типы данных и константы в одном модуле.

При описании функций требуется задать:

Библиотеку динамической компоновки, в которой хранится требуемая функция

Передаваемые в функцию параметры и их тип

Тип возвращаемого значения

Предупреждение

Очень важно правильно описать подпрограмму API, т. к. при обращении к библиотеке динамической компоновки, которая не применяется в основном приложении. можно случайно занять память, используемую другим приложением или самой операционной системой. Далее возникают ошибки разного рода: от простого сообщения об ошибке до сбоя в работе операционной системы.

Приведем пример описания функций Win32 API:

Declare Function GetWindowsDirectory Lib "kernel32" Alias _ "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As _ Long) As Long - получает путь к каталогу Windows

Declare Function GetSystemDirectory Lib "kernel32" Alias _ "GetSystemDirectoryA" (ByVal IpBuffer As String, ByVal nSize As _ Long) As Long - получает путь к системному каталогу Windows

Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _ (ByVal nBufferLength As Long, ByVal IpBuffer As String) As Long - получает путь к каталогу, выделенному под временные файлы

Declare Function SetCurrentDirectory Lib "kernel32" Alias _ "SetCurrentDirectoryA"(ByVal lpPathName As String) As Long - задает текущий каталог

На первый взгляд приведенные примеры могут показаться очень сложным. Однако усвоив только несколько основных правил, можно безопасно и эффективно использовать Win32 API.

Использование WIN32API.TXT

Microsoft поставляет вместе со многими приложениями, включая Visual Basic, файл WIN32API.TXT, который содержит описание всех функций Win32 API. В данном файле находятся также описание структур данных" констант, используемых подпрограммами API. Длина файла слишком велика, чтобы включать его в каждый проект VBA, поэтому можно скопировать в модуль описание требуемых функций, а также типов данных или констант.

Синтаксис описания

Приведем синтаксис инструкции описания функции Win32 API:

Declare Function | Sub имя Lib "имя библиотеки" (аргументы)

Ниже приводится описание параметров функции.

Функции и процедуры

В Win32 API имеются функции и процедуры. В первом примере показано описание процедуры, а во втором - описание функции:

Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" _ (lpSystemTime As SYSTEMTIME) - получает текущее системное время

Declare Function VerLanguageName Lib "kerne132" Alias _ "VerLanguageNameA" (ByVal wLang As Long, ByVal szLang As String, _ ByVal nSize As Long) As Long - получает текстовое название языка по идентификатору (&H4E3 - Windows (кириллица)

Обратите внимание на то, что в первом описании используется ключевое слово Sub.

Во втором описании используется ключевое слово Function. Обратите внимание на выражение As Long, которое указывает на тип возвращаемого функцией значения. Покажем фрагмент программы, при выполнении которой возникает ошибка несоответствия типов.

Declare Function SomeFunction Lib "SomeLib" (MyArgument) as Long

Dim MyReturn as String

MyReturn = SomeFunction(My Argument)

Задание имени библиотеки

При описании подпрограммы Win32 API необходимо задать библиотеку динамической компоновки, в которой находится эта подпрограмма.

Имя библиотеки указывается в кавычках после ключевого слова Lib. При этом обычно не требуется задавать расширение или путь к библиотеке.

Примечание

При обращении к функции Win32 API сначала производится поиск библиотеки в папке, из которой запущено приложение, а затем просматривается каталог SYSTEM папки Windows (SYSTEM32 для Windows NT). Если VBA не находит библиотеку в каталоге SYSTEM/SYSTEM32, то он пытается отыскать библиотеку в основном каталоге Windows. Таким образом, если не перемещать файлы из папки Windows, то разработчику совсем необязательно знать расположение библиотек на диске, т. к. они отыскиваются aавтоматически. Более того, перемещать файлы из папки SYSTEM/SYSTEM32 не рекомендуется при любых обстоятельствах.

Использование псевдонимов в описаниях

Псевдонимы позволяют вызвать функцию API в программе VBA под именем, которое отличается от заданного в библиотеке динамической компоновки названия. Псевдонимы появились в Win16 API, используемом в Windows 3.x и 16-битных приложениях Windows, из-за того, что имена функций API совпадали с некоторыми зарезервированными словами языка Visual Basic. По той же причине при описании функций Win32 API задаются псевдонимы, с помощью которых можно вызвать требуемые подпрограммы, т используя имен, эквивалентных ключевым словам VBA. Если имя функции совпадает с ключевым словом, требуется вызвать функцию, ссылаясь на нее c помощью псевдонима.

Наиболее критической и потенциально ошибочной частью описания является список параметров. Поскольку Win32 API разработан прежде всего для использования в языке программирования С, а к подпрограммам обращаются из VBA, то необходимо знать, как передавать аргументы по ссылке и по значению.

В большинство используемых в VBA подпрограмм API требуется передать параметры. По умолчанию VBA передает параметры в подпрограмму по ссылке. Это означает, что вместо того, чтобы использовать в процедуре копию переменной, VBA передает ее 32-битный адрес в памяти. Располагая адресом переменной, т. е. ссылкой на нее, процедура может обращаться и изменять значение самой переменной, а не ее копии.

Кроме того, учитывая, что Win32 API предназначен для использования в языке С, в API используется соглашение этого языка о том, что по умолчанию параметры передаются в подпрограммы по значению, а не по ссылке. Это относится ко всем типам данным, исключая строки и массивы, которые всегда передаются по ссылке. Необходимо также отметить, что для некоторых функций API передача параметров по ссылке обязательна.

Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal _ hFile As Long, IpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _ IpNumberOfBytesRead As Long, IpOverlapped As OVERLAPPED) As Long

При задании аргументов необходимо правильно указать способ передачи аргументов. При этом рекомендуется придерживаться следующих правил:

Тщательно изучите описание процедуры в файле WIN32API.TXT, чтобы узнать тип передаваемых параметров.

Тщательно изучите документацию по API и по требуемой процедуре. Документация по Win32 API поставляется вместе с Win32SDK, а также с Visual Basic.

Задание строк в качестве параметров описаний

Как уже отмечалось ранее, строки передаются в процедуры библиотеки динамической компоновки по ссылке, т. е. по адресу первого байта строки в оперативной памяти. Для этого в описании процедур используется ключевое слово ByVal. При передаче ссылки на строку она преобразуется в форму, которая применяется в языке С: в конце строки ставится символ Null, который указывает на ее окончание. Приведем пример использования функции Win32 API для запуска приложения со строками в качестве параметров:

Declare Function CreateProcess Lib "kerne132" Alias "CreateProcessA" (ByVal IpApplicationName As String, ByVal IpCommandLine As String, IpProcessAttributes As SECURITY_ATTRIBUTES, IpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal IpCurrentDriectory As String, IpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long

Проверка описания

По завершении задания описания необходимо проверить его. Для этого необходимо запустить любую подпрограмму, которая имеется в одном модуле с указанным описанием. При этом можно выявить ошибки в описании, а также неправильное использование констант. Необходимо отметить, что поскольку при запуске процедуры VBA автоматически компилируется модуль, в котором она находится, можно использовать любую подпрограмму она может быть не закончена или не использована в разрабатываемом приложении. Например, следующая подпрограмма устанавливает значение переменной. Конечно, вместо запуска проверочной процедуры можно просто скомпилировать проект.

Public Sub CheckDex ()

Вызов подпрограммы Win32 API

После описания подпрограмм необходимо вызвать их. Обратиться к функции Win32 API настолько же просто, как и вызвать собственную функцию или подпрограмму. Необходимо только следовать следующим правилам:

Правильно описать используемые в подпрограмме переменные

Правильно обработать возвращаемые функцией значения

В программе показан вызов функции, которая определяет тип дисковода, заданного символом "F". Обратите внимание, как передается в функцию строка, как возвращаемое функцией значение записывается в переменную типа Long, и как используется блок Case... Select для обработки всех возвращаемых значений.

" Значения, возвращаемые функцией GetDriveType

Public Const DRIVE_REMOVABLE = 2"

Public Const DRIVE_FIXED = 3

Public Const DRIVE__REMOTE = 4

Public Const DRIVE_CDROM = 5.

Public Const DRIVE_RAMDISK = 6

Declare Function GetDriveType Lib "kerne132" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

Public Sub DisplayDriveType ()

Dim sDriveLetter As String

Dim lDriveType As Long

sDriveLetter = "F:"

lDriveType = GetDriveType (sDriveLetter)

Select Case lDriveType

Case DRIVE_REMOVABLE

Debug.Print "Дисковод ", sDriveLetter, " используется для чтения дискет."

Case DRIVE_FIXED

Debug.Print "Диск ", sDriveLetter, " - жесткий диск."

Case DRIVE_REMOTE

Debug.Print "Диск ", sDriveLetter, " - сетевой диск."

Base DRIVE_CDROM

Debug.Print "Дисковод ", sDriveLetter, "используется для чтения компакт-дисков."

Case DRIVE__RAMDISK

Debug.Print "Диск ", sDriveLetter, " - виртуальньй диск."

Debug.Print "Ошибка вызова функции."

Использование строк в качестве возвращаемых значений

Ранее рассматривалось, как передать строки в качестве параметров функций Win32 API. Для использования строки в качестве возвращаемого подпро-граммой значения, необходимо передать в функцию строковую переменную, чтобы сама функция установила значение этой переменной.

Рассмотрим функцию GetTempPath (), используемую для определения папки, в которой Windows хранит промежуточные данные. Вызов функции. GetTempPath () является следующим:

return = GetTempPath (PathLength, Path)

Функция записывает в переменную Path путь к папке, в которой хранятся промежуточные данные. Например, в следующем фрагменте в окно отладки. выводится текущий путь к папке с временной информацией:

Return = GetTempPath (len (ThePath) , ThePath)

Debug.Print ThePath

Предупреждение

При вызове функции необходимо заранее указать размер возвращаемой строки, чтобы выделить память на ее хранение. В противном случае при записи строки в память можно испортить важную информацию, используемую основным приложением и даже операционной системой, что может привести к сбою в их работе. Если предварительно задать размер строки то функция вводит в строку только то количество данных, которое определено заданным размером строки.

Public Sub PrintTempPathO

Dim sThePath as String

Dim iPathLength as Long

Dim lResult as Long

iPathLength =256

sthePath = String$(iPathLength,0)

lResult = GetTempPath(iPathLength,sThePath)

Значения, возвращаемые функциями Win32 API

Большинство подпрограмм Win32 API являются функциями. Возвращаемое значение - это либо данные, например, возвращаемое функцией GetDriveType () значение, либо просто результат выполнения функции: успешно или не успешно. Например, рассмотрим функцию SetCurrentDirectory (), которая устанавливает текущую папку:

Dim lReturn as long

lReturn = SetCurrentDirectory(С:\WORK")

Если функция установила папку "C:\WORK" текущей, то переменная lReturn имеет значение отличное от 0. В противном случае, например, если каталог не существует, переменной lReturn присваивается значение 0.

Примечание

Одни функции Win32 API возвращают значение 0 в случае успешного завершения, а другие - в случае ошибки. Подробную информацию о возвращаемых функциями Win32 API значениях смотрите в документации по Win32 SDK.

Кроме того, некоторые функции присваивают значение передаваемому в них параметру, а также имеют возвращаемое значение. Рассмотрим функцию GetPrivateProfile (), которая используется для чтения данных из файла INI, хранящего информацию о конфигурации 16-битных приложений Windows:

Dim lSize as long

Dim strSize as long

Dim strValue as string

StrValue = String$ (strSize, 0)

lSize = GetPrivateProfileString ("CoolApplication", _ "ApplicationPath", "", strValue, strSize, "C:\MYINI.INI")

Функция GetPrivateProfile () извлекает значение параметра ApplicationPath раздела CoolApplication и присваивает его строковой переменной strValue, которая передается в функцию в качестве параметра. Кроме того, в переменную lSize записывается длина строки, присвоенной переменной strValue. Необходимо отметить, что если при выполнении функции GetPrivateProfile () возникает ошибка, то переменной lSize присваивается значение Null.

Работа с дескрипторами

Gри работе с Win32 API используются дескрипторы. Дескриптор - это 32-битное целое число, которое однозначно идентифицирует компоненты, используемые при программировании Win32 API, например, диалоговые окна, элементы управления в них, окна, битовые изображения, кисти, используемые для рисования картинок на экране, аппаратные средства. Необходимо отметить, что компоненту сначала назначается дескриптор, а затем этот дескриптор используется для работы с компонентом. Имена дескрипторов обычно задают имена, начинающиеся с префикса h.

В следующем описании параметр hWnd используется для задания дескриптора окна:

Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg_ As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin В As Long, ByVal _ wMsgFilterMax As Long) As Long

В следующем описании параметр hDevice является дескриптором конфигурации устройства:

Declare Function DeviceIoControl Lib "kerne132" Alias _ "DeviceIoControl" (ByVal hDevice As Long, ByVal dwIoControlCode As _ Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer _ As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, _ lpOverlapped As OVERLAPPED) As Long

При работе с дескриптором в VBA требуется только знать, где его указывать: обычно одна функция возвращает дескриптор компонента, а затем этот дескриптор используется для работы с элементом в других функциях.

Другие полезные примеры

Здесь приводятся несколько полезных примеров применения функций Win32 АРI.

Завершение работы Windows:

Declare Function ExitWindows Lib "user32" Alias "ExitWindowsEx" _ (ByVal dwReserved As Long, ByVal uReturnCode As Long) As Long

Const EWX_LOGOFF=0

Const EWX_SHUTDOWN=1

Const EWX_REBOOT=2

Const EWX_FORCE=4

Const EWX_POWEROFF=8

Private Sub CommandButton1_Click()

Dim flag As Long

Dim Result As Long

If Me.OptionButton1.Value = True Then flag = 0

Else If Me.OptionButton2.Value = True Then flag = 8

Else If Me.OptionButton3.Value = True Then flag = 2

Result = ExitWindows(flag, 0)

Переключение на русскую кодировку:

Public Declare Function ActivateKeyboardLayout Lib "user32" (ByVal _ HKL As Long, ByVal flags As Long) As Long

Public Declare Function GetKeyboardLayout Lib "user32" (ByVal _ dwLayout As Long) As Long

Private Sub UserForm_Initialize()

Dim lang As Long

lang = GetKeyboardLayout(0)

If lang <> 68748313 Then i = ActivateKeyboardLayout(68748313, 0)

Закрытие окна:

Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long

Declare Function DestroyWindow Lib "user32.dll" (ByVal hwnd As Long) As Long

Private Sub CommandButton3_Click()

Dim hwnd As Long, retval As Long

Dim temp As String

hwnd = FindWindow(CLng(0), temp) " look for the window

retval = DestroyWindow(hwnd)

Работа с реестром

В Windows 9х и Windows NT, a также приложениях, работающих под их управлением, используется специальная база данных, в которой хранится требуемая для выполнения программ информация: данные о компьютере, на котором инсталлировано программное обеспечение, о пользователях, об установленных аппаратных средствах и т. д. Эта база данных называется реестром. Для доступа к реестру из VBA используются функции Win32 АРI. Кроме того, чтобы просмотреть и отредактировать реестр вручную, можно запустить программу REGEDIT (REGEDT32 для Windows NT).

Перед рассмотрением функций, используемых для работы с реестром, опишем реестр и его структуру.

Структура реестра

Реестр имеет структуру дерева. В нем имеются шесть основных поддеревьев (пять в Windows NT). Элементы реестра называют ключами. Ключ может иметь подключи, а подключи - включать дополнительные ключи, например HKEY_CURRENT_USER\ControlPanel\ Accessibility.

Данные в реестре используются приложениями и операционной системой способами:

Иногда в приложении требуется просто проверить существование ключа. Например, приложение ищет ключ HKEY_CURRENT_CONFIG\Display\Settings и не проверяет наличие в нем подключей или параметров.

В других случаях требуется использовать данные, хранящиеся под ключом. Под ключами содержатся двоичные или строковые параметры и их значения. Каждый ключ имеет значение по умолчанию, а также любое число именованных значений.

Ключи реестра

В верхней части дерева реестра имеются шесть основных ключей. Рассмотрим каждый из них:

HKEY_LOCAL_MACHINE. Под данным ключом хранятся данные, описывающие установленные на компьютере аппаратные средства и программное обеспечение.

HKEY_CURRENT_CONFIG. Под данным ключом хранится информация о конфигурации установленных на компьютере аппаратных средств.

HKEY_DYN_DATA (только Windows 9х). Под данным ключом хранится информация об установленных на компьютере самонастраивающихся устройств Plug и Play.

HKEY_CLASSES_ROOT. Под данным ключом хранится информация установленном на компьютере программном обеспечении, включая данные, используемые операционной системой.

HKEY_USERS. Под данным ключом хранится информация о пользователях.

HKEY_CURRENT_USER. Под данным ключом хранится информация о текущем пользователе.

Использование VBA для доступа к реестру с помощью функций Win32 API

В VBA можно управлять реестром с помощью функций Win32 API, например:

Создать новые ключи в реестре

Экспортировать реестр в файл

Импортировать данные реестра из внешнего файла

Описания, константы и типы данных реестра

При рассмотрении нижеприведенных примеров предполагается, что описаны функции, константы и типы данных, используемые в подпрограммах Win32 API, которые работают с реестром.

Открытие ключа

Чтобы работать с ключами реестра, необходимо предварительно открыть их. При открытии ключа возвращается его дескриптор. Как уже отмечалось ранее, для ссылки на данные можно использовать их дескриптор, в данном случае для доступа к ключу используется дескриптор ключа. Для открытия ключа используется функция RegOpenKey (), которая возвращает значение, указывающее на то, было ли ее выполнение успешным или нет. Кроме того, данная функция присваивает своему аргументу дескриптор ключа. Покажем пример использования функции RegOpenKey (). В программе выводится число 0 в окне отладки, если при выполнении функции не возникло ошибок, а также отображается значение параметра hSubKeyHandle, который является дескриптором ключа

Программа открытия ключа:

Public Sub OpenRegistryKeyDemo()

Dim lReturn As Long

Dim sSubKey As String

Dim hSubKeyHandle As Long

lReturn = RegOpenKey&(HKEY_LOCAL_MACHINE, "Config", hSubKeyHandle)

Debug.Print lReturn

Debug.Print hSubKeyHandle

Чтение значения параметра реестра

Получив дескриптор ключа, можно извлечь значение параметра реестра. При этом можно прочитать как значение параметра по умолчанию, так и величину любого именованного аргумента. Для чтения значения параметра реестра используется одна из двух функций:

Функция RegQueryValueO. Извлекает значение параметра по умолчанию

Функция RegQueryValueEx (). Извлекает значение именованного параметра.

Чтобы получить значение именованного параметра, используйте функцию RegQueryValueEx(). Например, под ключом HKEY_CURRENT_СОNFIG\Display\Settings имеется параметр Resolution, в котором хранится разрешение экрана. В программе показан пример чтения значения именованного параметра. Программа требует некоторых пояснений:

Функция RegOpenKey () используется для получения дескриптора требуемого ключа. Дескриптор передается в функцию RegQueryValueEx ().

Строковый параметр инициализируется до вызова функции, которая читает значение параметра реестра.

Третий аргумент функции RegQueryValueEx () зарезервирован для использования Windows, ему требуется присвоить значение 0.

Четвертый аргумент функции RegQueryValueEx () используется для задания типа возвращаемых данных. Возможные значения смотрите в списке констант реестра. Поскольку возвращаемая величина является строкой, необходимо указать константу REG_SZ, которая задает заканчивающуюся символом Null строку.

Public Sub GetRegistryNameValueDemo ()

Dim lReturn As Long

Dim sSubKey As String

Dim hSubKeyHandle As Long

Dim sValue As String

Dim lSize As Long

SValue=String$(lSize, 0)

lReturn = RegOpenKeyEx(HKEY_CURRENT__CONFIG, Display\Settings", 0, _ KEY_ALL_ACCESS, hSubKeyHandle)

If lReturn<> 0 Then Exit Sub

lReturn = RegQueryValueEx(hSubKeyHandle, "Resolution", 0, REG_SZ, _ sValue, lSize)

Debug.Print sValue

Создание ключа

Реестр используется не только операционной системой и большими приложениями. Даже в маленькой программе VBA можно сохранить в реестре требуемые данные. При этом, наверное, понадобится создать ключ, выбрав и его хранения любой из основных ключей.

Функция RegCreateKey () используется для создания ключа реестра. Кроме того, для этого применяется функция CreateRegKeyEx (), которая имеет большее число аргументов, например, параметры, гадающие защиту.

С помощью функции RegCreateKey () можно создать как один, так и структуру из нескольких ключей, например, добавить ключ "NEWKEY" под ключ HKEY_CURRENT_USER, или создать структуру KEYONE\KEYTWO\KEYTHREE под ключом HKEY_CURRENT_USER. В программе показано создание структуры разделов под ключом HKEY_LOCAL_MACHINE.

Программа создания ключей реестра

Public Sub CreateRegistryKeyDemo ()

Dim lReturn As Long

Dim sSubKey As String

Dim hSubKeyHandle As Long

sSubKey = "SOFTWARE\Использование VBA\Win32 API\Обзор"

lReturn = RegCreateKey& (HKEY_LOCAL_MACHINE, sSubKey, _ hSubKeyHandle)

Установка значения параметра

Для установки значений параметров реестра по умолчанию используется функция RegSetValue (), а для задания величин именованных параметров- функция RegSetValueEx(). Необходимо отметить, что функцию RegSetValueExО можно применять, например, для установки значений именованных параметров ключа, созданного предыдущей программой. В следующей программе показано использование функции RegSeiValue(). Перед установкой значений требуется открыть ключ, под которым находится требуемый параметр. Единственным исключением из этого правила являются параметры реестра, которые хранятся под одним из шести основных ключей (пяти в Windows NT). В этом случае следует задать имя ключа (например, HKEY_LOCAL_MACHINE), а не дескриптор ключа в качестве первого параметра функции RegSetValue ().

Программа требует некоторых пояснений:

Имя параметра и устанавливаемое значение непосредственно передаются в функцию RegSetValueEx ().

Переменная lValueSize задает длину присваиваемого параметру строкового значения.

В качестве четвертого аргумента функции RegSetValueEx () требуется задать тип устанавливаемого значения (REG_SZ). Список констант, соответствующих допустимым типам, приводится в разделе "Описания, константы и типы данных реестра".

Третий аргумент функции RegSetValueEx () всегда равен 0.

Public Sub SetRegistryValue ()

Dim lReturn As Long

Dim hSubKeyHandle As Long

Dim sSubKeyName as String

Dim sValueName As String

Dim sValue As String

sSubKeyWame = "SOFTWARE\Использование VBA\Win32 API\Обзop"

"Открытие ключа и получение его дескриптора

lReturn = RegOpenKey(HKEY_LOCAL_MACHINE, sSubKeyNaine, hSubKeyHandle)

If lresult <> 0 Then Exit Sub

"Установка первого значения

sValueMame = "Скучно?"

sValue = "Нет"

lValueSize = Len (sValue)

" Установка второго значения

lsValueName = "Весело?"

sValue = "Конечно"

lValueSize = Len (sValue)

lReturn = RegSetValueEx (hSubKeyHandle, sValueName, 0, REG_SZ, sValue, lValueSize)



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: