Пошаговое руководство. Вызов API Windows (Visual Basic)Walkthrough: Calling Windows APIs (Visual Basic). Работа с windows api visual


Пошаговое руководство. Вызов API Windows (Visual Basic)

Рекомендуем использовать Visual Studio 2017

Эта документация перемещена в архив и не поддерживается.

Visual Studio 2013

Интерфейсы Windows API являются динамическими библиотеками (DLL), частью операционной системы Windows. Они используются для решения задач в том случае, когда сложно написать собственную соответствующую процедуру. Например, в Windows есть функция под названием FlashWindowEx, позволяющая изменять строку заголовка приложения от светлого оттенка к темному.

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

Интерфейсы Windows API представляют собой специальную категорию взаимодействия. Интерфейсы Windows API не используют управляемый код, не имеют встроенных библиотек и пользуются типами данных, отличными от применяемых Visual Studio. Из-за перечисленных различий, а также потому, что интерфейсы Windows API не являются объектами COM, взаимодействие между интерфейсами Windows API и .NET Framework выполняется с привлечением платформенного вызова или PInvoke. Платформенным вызовом называется служба, позволяющая управляемому коду вызывать реализованные в DLL неуправляемые функции. Дополнительные сведения см. в разделе Использование неуправляемых функций DLL. Можно использовать PInvoke в Visual Basic, используя либо инструкцию Declare, либо применения атрибута DllImport к пустой процедуре.

Вызовы Windows API были важной частью программирования Microsoft Visual Basic в прошлом, но редко необходимы с Visual Basic 2005. При возможности для выполнения задач следует пользоваться управляемым кодом .NET Framework, а не вызовом Windows API. В этом пошаговом руководстве демонстрируются ситуации, когда необходимо использование интерфейсов Windows API.

Примечание

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Настройка параметров разработки в Visual Studio.

Самый распространенный способ вызова интерфейса Windows API — посредством оператора Declare.

Объявление процедуры DLL

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

    Примечание

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

  2. Создайте новый проект "Приложение Windows", щелкнув пункт Создать в меню Файл, а затем выбрав Проект. Откроется диалоговое окно Новый проект.

  3. Выберите Приложение Windows из списка шаблонов проектов Visual Basic. Появится новый проект.

  4. Добавьте следующую функцию Declare либо в класс, либо в модуль, в котором требуется использование DLL:

    Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" ( ByVal hWnd As Integer, ByVal txt As String, ByVal caption As String, ByVal Typ As Integer) As Integer

Оператор Declare включает следующие элементы:

Модификатор Auto инструктирует среду выполнения о необходимости преобразования строки на основе имени метода в соответствии с правилами общеязыковой среды выполнения (или именами-псевдонимами, если они указаны).

Имя, которое следует за ключевым словом Function — это имя, которое программа использует для доступа к импортируемой функции. Оно может быть идентичным настоящему имени вызываемой функции. Другой способ — воспользоваться любым допустимым именем процедуры, а затем задействовать ключевое слово Alias, чтобы указать настоящее имя вызываемой функции.

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

Ключевое слово Alias следует использовать, если имя вызываемой функции не является допустимым именем процедуры Visual Basic или конфликтует с именем других элементов в приложении. Ключевое слово Alias указывает правильное имя вызываемой функции.

Объявите аргументы и их типы данных. Эта задача может быть достаточно сложной, поскольку типы данных, используемые в Windows, не соответствуют типам данных Visual Studio. Visual Basic выполняет большой объем работы за разработчика, преобразуя аргументы в совместимые типы данных. Этот процесс называется маршалингом. Можно явным образом управлять маршалингом аргументов с помощью атрибута MarshalAsAttribute, определенного в пространстве имен System.Runtime.InteropServices.

Примечание

Предыдущие версии Visual Basic позволяли объявлять параметры As Any, означающие, что могут использоваться данные любого типа. В Visual Basic необходимо использовать определенный тип данных для всех инструкций Declare.

Некоторые аргументы являются сочетаниями констант. Например, рассматриваемый в этом пошаговом руководстве интерфейс API MessageBox принимает целочисленный аргумент под названием Typ, который определяет вид окна сообщения. Определите имя числовое значение этих констант, изучив инструкции #define в файле WinUser.h. Числовые значения, как правило, приведены в шестнадцатеричной системе счисления, поэтому, возможно, потребуется воспользоваться калькулятором для их сложения и преобразования в десятичную систему счисления. Например, если необходимо сложить константы стиля восклицания MB_ICONEXCLAMATION 0x00000030 и стиля "Да/Нет" MB_YESNO 0x00000004, можно сложить эти числа и получить результат 0x00000034, или 52 в десятичном счислении. Несмотря на то, что можно использовать непосредственно десятичное число, корректнее объявить эти значения в приложении как константы и сочетать их при помощи оператора Or.

Объявление констант для вызовов интерфейса Windows API

  1. Обратитесь к документации для вызываемой функции Windows. Определите имя константы, которую она использует, и имя H-файла (с расширением .h), который содержит числовые значения для этих констант.

  2. Чтобы просмотреть содержимое файла заголовка (H-файла) и найти соответствующие применяемым константам значения, используйте текстовый редактор, например "Блокнот". Например API-интерфейс MessageBox использует константу MB_ICONQUESTION, чтобы показать знак вопроса в окне сообщения. Определением для MB_ICONQUESTION является WinUser.h, и выглядит оно следующим образом:

    #define MB_ICONQUESTION 0x00000020L

  3. Добавьте соответствующие инструкции Const в ваш класс или модуль, чтобы сделать эти константы доступными для приложения. Примеры.

    Const MB_ICONQUESTION As Integer = &h30 Const MB_YESNO As Integer = &h5 Const IDYES As Integer = 6 Const IDNO As Integer = 7

Вызов процедуры DLL

  1. Добавьте в форму запуска проекта кнопку под названием Button1, а затем выполните на ней двойной щелчок мышью, чтобы просмотреть код. Появится обработчик событий для данной кнопки.

  2. Вставьте в обработчик событий Click новой кнопки следующий код, чтобы вызвать процедуру, и предоставьте соответствующие аргументы:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Stores the return value.  Dim RetVal As Integer RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox", MB_ICONQUESTION Or MB_YESNO) ' Check the return value.  If RetVal = IDYES Then MsgBox("You chose Yes") Else MsgBox("You chose No") End If  End Sub
  3. Запустите проект, нажав клавишу F5. Появится окно сообщений с кнопками Да и Нет. Нажмите одну из них.

Visual Basicавтоматически преобразует типы данных параметров и возвращаемых значений вызовов интерфейса Windows API, но можно также применить атрибут MarshalAs, чтобы явным образом определить ожидаемые интерфейсом API неуправляемые типы данных. Дополнительные сведения о маршалинге взаимодействия содержатся в разделе Маршалинг взаимодействия.

Использование при вызове интерфейса API оператора Declare и атрибута MarshalAs

  1. Выясните имя вызываемой функции, ее аргументы, типы данных и возвращаемое значение.

  2. Чтобы упростить доступ к атрибуту MarshalAs, в начале кода класса или модуля вставьте оператор Imports, как показано в следующем примере:

    Imports System.Runtime.InteropServices
  3. Добавьте прототип функции для импортированной функции в класс или модуль, который вы используете, и примените атрибут MarshalAs к параметрам или возвращаемому значению. В следующем примере демонстрируется вызов API, предполагающий маршалинг типа void* как AsAny:

    Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" ( ByVal x As Short, <MarshalAsAttribute(UnmanagedType.AsAny)> ByVal o As Object)

Атрибут DllImport реализует второй способ вызова функций в DLL без библиотек типов. DllImport в общих чертах похож на инструкцию Declare, но обеспечивает больший контроль над процессом вызова функций.

Атрибут DllImport можно применять с большинством вызовов интерфейса Windows API, при условии, что вызов связан с общим (иначе называемым статическим) методом. Нельзя использовать методы, которым требуется экземпляр класса. В отличие от инструкций Declare, вызовыDllImport не могут использовать атрибут MarshalAs.

Вызов интерфейса Windows API с помощью атрибута DllImport

  1. Создайте новый проект "Приложение Windows", щелкнув пункт Создать в меню Файл, а затем выбрав Проект. Откроется диалоговое окно Новый проект.

  2. Выберите Приложение Windows из списка шаблонов проектов Visual Basic. Появится новый проект.

  3. Добавьте кнопку с именем Button2 в начальную форму.

  4. Дважды щелкните кнопку Button2, чтобы просмотреть код формы.

  5. Чтобы упростить доступ к атрибуту DllImport, в начале кода класса начальной формы вставьте оператор Imports:

    Imports System.Runtime.InteropServices
  6. Перед оператором формы End Class объявите пустую функцию и озаглавьте ее MoveFile.

  7. Примените к объявлению функции модификаторы Public и Shared и установите для MoveFile параметры на основе аргументов, используемых функцией Windows API:

    Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean  ' Leave the body of the function empty.  End Function

    Функция может иметь любое допустимое имя процедуры; атрибут DllImport задает это имя в библиотеке DLL. Кроме того, он управляет маршалингом взаимодействия для параметров и возвращаемых значений, поэтому есть возможность выбрать типы данных Visual Studio, аналогичные типам данных, используемым в API.

  8. Примените к пустой функции атрибут DllImport. Первый параметр — имя и расположение библиотеки DLL, в котором хранится вызываемая функция. Для файлов, расположенных в системных каталогах Windows, указывать путь не требуется. Второй параметр — именованный аргумент, который задает имя функции в Windows API. В этом примере атрибут DllImport принудительно перенаправляет вызовы MoveFile к MoveFileW в Kernel32.dll. Метод MoveFileW копирует файл из пути src в путь dst.

    <DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean  ' Leave the body of the function empty.  End Function
  9. Для вызова функции добавьте в обработчик событий Button2_Click следующий код:

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt") If RetVal = True Then MsgBox("The file was moved successfully.") Else MsgBox("The file could not be moved.") End If  End Sub
  10. Создайте файл с именем Test.txt и поместите его на жесткий диск в каталог C:\Tmp. При необходимости создайте каталог Tmp.

  11. Нажмите клавишу F5 для запуска приложения. Появится главная форма.

  12. Нажмите кнопку Button2. Если файл можно перемещать, появится сообщение "The file was moved successfully" ("Файл успешно перемещен").

Ссылки
Основные понятия
Другие ресурсы

msdn.microsoft.com

Введение в создание оконных приложений

 

Программирование в Windows основывается на использовании функций API (Application Program Interface, т.е. интерфейс программного приложения).

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

Программный интерфейс приложений

Windows API (Application Programming Interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Microsoft Windows.

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

Все основные функции Windows объявляются в заголовочных файлах. Главный заголовочный файл называется WINDOWS.H, и в этом файле содержится множество ссылок на другие заголовочные файлы.

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

При запуске программы Windows она взаимодействует с операционной системой посредством процесса «динамического связывания». Большая часть динамических библиотек DLL расположена в каталоге WINDOWS\SYSTEM.

При компоновке программы для Windows, чтобы сделать ее исполняемой, необходимо связывать ее с «библиотеками импорта», поставляемыми в составе среды программирования (IDE – Integrated Development Environment), которой может являться, в частности, Microsoft Visual Studio. Библиотеки импорта содержат имена всех функций Windows из динамически подключаемых библиотек и ссылки на них. Компоновщик использует эту информацию для создания в исполняемом EXE-файле таблицы, которую Windows использует при загрузке программы для настройки адресов функций API.

Графический интерфейс пользователя

Графический интерфейс пользователя (Graphical User Interface, GUI) еще называют «визуальный интерфейс» или «графическая оконная среда».

GUI делает возможным использование графики на растровом экране. Графика дает лучшее восприятие элементов управления на экране, визуально богатую среду для передачи информации. В GUI экран становится устройством ввода и показывает различные графические объекты в виде картинок и конструкций для ввода информации, таких как кнопки или полосы прокрутки. Используя клавиатуру и манипулятор (мышь, тачпад), пользователь может непосредственно оперировать объектами на экране. Графические объекты можно перетаскивать, кнопки можно нажимать, полосы прокрутки можно прокручивать. Взаимодействие между пользователем и программой становится более тесным.

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

Любая программа для Windows имеет окно — прямоугольную область на экране, в котором приложение отображает информацию и получает реакцию от пользователя. Окно идентифицируется заголовком. Большинство функций программы запускается посредством меню. Слишком большой для экрана объем информации может быть просмотрен с помощью полос прокрутки. Некоторые пункты меню вызывают появление окон диалога, в которые пользователь вводит дополнительную информацию.

Программирование Windows-приложений тесно связано с понятиями объектно-ориентированного программирования. Главным объектом в операционной системе Windows является окно. Окно может содержать элементы управления: кнопки, списки, окна редактирования и др. Эти элементы, по сути, также являются окнами, но обладающими особыми свойствами.

Активное окно – окно, получающее реакцию от пользователя в данный момент.

Основными элементами окна являются

  • 1 — строка заголовка title bar
  • 2 — строка меню menu bar
  • 3 — системное меню system menu
  • 4 — кнопка сворачивания окна minimize box
  • 5 — кнопка разворачивания окна maximize box
  • 6 — рамка изменения размеров sizing border
  • 7 — клиентская область client area
  • 8 — горизонтальная и вертикальная полосы прокрутки scroll bars

 

Многозадачность

Многозадачность (multitasking) — свойство операционной системы обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких процессов.

Операционная система Windows является многозадачной. Если программа DOS после своего запуска должна быть постоянно активной, и если ей что-то требуется (к примеру, получить очередную порцию данных с устройства ввода-вывода), то она сама должна выполнять соответствующие запросы к операционной системе, то в Windows все наоборот. Программа пассивна, после запуска она ждет, когда ей уделит внимание операционная система. Операционная система делает это посылкой специально оформленных групп данных, называемых сообщениями. Сообщения могут быть разного типа, они функционируют в системе достаточно хаотично, и приложение не знает, какого типа сообщение придет следующим.

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

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

Процессы и потоки

Процессом (process) называется экземпляр программы, загруженной в память. Экземпляр программы может создавать потоки (thread), которые представляют собой последовательность инструкций на выполнение.

Выполняются не процессы, а именно потоки. Любой процесс имеет хотя бы один поток. Этот поток называется главным (основным) потоком приложения.

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

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

Дескрипторы

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

Примеры дескрипторов, описанных в заголовочном файле windows.h

          

typedef void *HANDLE;  // абстрактный дескриптор (например, файла)typedef void *HMODULE;  // дескриптор модуляtypedef void *HINSTANCE; // дескриптор экземпляра программыtypedef void *HKEY;  // дескриптор ключа в реестреtypedef void *HGDIOBJ;  // дескриптор граф. примитива (перо, кисть)typedef void *HWND;  // дескриптор окнаtypedef void *HMENU;  // дескриптор менюtypedef void *HICON;  // дескриптор иконкиtypedef void *HBITMAP;  // дескриптор картинкиtypedef void *HFONT;  // дескриптор шрифта

Контекст устройства

GDI – графический интерфейс устройства. Функции системной библиотеки GDI32.dll используются для вывода графики на экран.

Дескриптор контекста устройства — это паспорт конкретного окна для функций GDI. Контекст устройства фактически является структурой данных, которая внутренне поддерживается GDI. Он связан с конкретным устройством вывода информации (принтер, дисплей). Что касается дисплея, то в данном случае контекст устройства обычно связан с конкретным окном на экране.

Назад: Создание Windows-приложений

prog-cpp.ru

Visual Basic с нуля. Введение. WinAPI32. Общие сведения об API.

Вступление. Дорогой друг. Перед тобой попытка сделать максимально понятное и доступное пособие по API-функциям, чтобы даже совершенно неопытный программист мог использовать их в своих программах. Попытка эта может быть неудачной, но тем не менее в главах 2-й части самоучителя ты найдешь полезные сведения и приемы работы с API. Идея реализации этого не нова - разбор примеров с API с очень простым и ясным кодом. Однако общая концепция построения самоучителя будет корректироваться в процессе работы. Хочу предупредить, что все примеры написаны и проверены под Windows XP Professional. Использование API в данном пособии предполагает использование 32-разрядных платформ (Windows 98/2000/NT/XP) и совместимых с Visual Basic 4.0 и выше.

Для чего вообще париться с API? Желание примененить API (Application Programming Interface), как мне кажется, в первую очередь предполагает возникновение у программиста задачи, которую невозможно реализовать внутренними возможностями VB. И второе - это просто интерес к API и тому, что можно сделать с помощью Windows - так сказать, спортивный интерес. Можно, конечно, написать программу, состоящую чуть-ли не из одних API. Однако, как мне кажется, если есть возможность решить задачу средствами VB, то и нефиг пыжится с API. Тем более, что для многих функций API есть аналоги, уже встроенные в Visual Basic. Использование API очень тесно связано с внутренним устройством Windows. Впрочем как и сам Visual Basic. Но в VB мы этого не замечаем, эта замечательная программа берет на себя почти все вопросы по "утряске" работы твоего приложения с твоей операционной системой. Совсем другое дело при работе с API. Хотя бейсик здесь тоже пытается не допустить фатальных ситуаций, вероятность возникновения трудноуловимых ошибок здесь гораздо выше. Хотя при правильном использовании API они достаточно надежны. Но и здесь возможно явное столкновение с извращениями компании Microsoft. Данное пособие не ставит собой целью фундаментально изучать ее операционную систему. Да мы вообще ничего не изучаем,а так, балуемся. Поэтому, чтобы не туманить себе мозги мы будем по ходу использовать лишь крайне необходимые и вобщем-то общеизвестные сведения о Windows.

Что такое API и откуда они берутся? Ниоткуда они не берутся. Они есть на твоем компьютере, независимо от того, используем мы их или нет. Это просто функции, которые возвращают определенные значения. И все приложения Windows их постоянно используют для выполнения типовых задач. Физически они находятся в особых исполняемых файлах с расширенем .dll, которые называются библиотеками динамической связи. По большому счету мы можем использовать эти функции также, как и встроенные функции VB. Вообще-то не все API могут быть вызваны из VB, так как их параметры несовместимы с Visual Basic. Все API написаны на языке C - чуждого по синтаксису и структуре языку VB. VB прост как носок, С - сложен как портянка. Именно поэтому объявления API-функций так неорганично вписываются в VB. Однако это никого не останавливает в их использовании.

Так как их использовать? А использование API начинается с их объявления. Неправильные объявления являются причиной большинства ошибок. Объявлять их предпочтительнее в стандартном модуле с ключевым словом Public, хотя, если проект простой, можно объявить их и в форме. Никогда не пиши объявления с клавиатуры. Копируй функцию из файла Win32API.txt или других надежных источников. Это сократит возможность появления ошибок в объявлении до минимума.

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

Public/Private Declare Function Имя_функции Lib Библиотека Alias Псевдоним (Список_аргументов) As Тип

где синим цветом выделен "скелет" объявления:Public/Private - понятно, что ключевые слова. В коде формы функция объявляется с ключевым словом Private, в стандартном модуле - с Public, или вовсе без ключевого слова (но при этом использование функции будет возможно только в модуле). Declare Function - команда, которая собственно объявляет функциюИмя_функции - определяет то имя функции, с которым мы будем в дальнейшем работать в коде программыБиблиотека - определяет имя DLL-библиотеки (по сути имя файла), содержащей функциюПсевдоним - как-бы второе имя функции, псевдоним, который можно использовать в VB, если Имя_функции по каким-то причинам (несовместимость синтаксиса, совпадение с именами команд и функций VB) не может быть использовано. Имеется не всегда.(Список_аргументов) - это переменные строго определенного типа, которые мы передаем или получаем. Их имена для нас не имеют особого значения, поскольку мы все равно в программе используем свои.Тип - тип значения, которое возвращает наша функция, а именно Byte, Long, Boolean, Integer, Single, Double, Currency, Date, String, Object, Variant. В объявлении определять тип возвращаемого значения можно и с помощью значка определителя типа (например типу Integer соответствует значок %), тогда секция Тип не нужна. Подробнее типы данных ты можешь посмотреть на странице "Типы данных, поддерживаемые VB".

Но на самом деле, из всего этого обилия, нам главным образом нужно Имя_функции, чтобы обратиться к нему в нашей программе и порядок и тип переменных в Списке_аргументов. Реально же объявление функции GetWindowText, позволяющей получить заголовок окна будет выглядеть в соответствии с файлом Win32API.txt следующим образом:

Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

А если использовать значок определителя типа, то так:

Public Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) Обратите внимание, что библиотека имеет только имя файла, без расширения .dll. Такое написание возможно только при использовании основных DLL (User32, Kernel32, и GDI32). В остальных случаях использование расширения dll в имени библиотеки обязательно.

Теперь, чтобы нам никогда-никогда не делать ошибок в объявлении API, научимся пользоваться справочным файлом Win32API.txt.

Добавление API в проект.

Исходя из того, что правильное объявление API является залогом нашего успеха, нам надо знать, где найти правильное объявление функции и откуда его скопировать. В стандартную поставку VB6 включен файл Win32API.txt. В нем имеются все объявления, константы и пользовательские типы. Но если ты откроешь его в текстовом редакторе, то офигеешь и сразу закроешь (можешь попробовать, он лежит обычно в C:\Program Files\Microsoft Visual Studio\Common\Tools\Winapi). Но нас простым финским ножом не испугаешь, поэтому мы хладнокровно воспользуемся утилитой API Viewer. И с ее помощью сможем очень быстро и легко находить и копировать объявления API-функций. Сейчас мы попробуем практически этой утилитой добавить функцию в наш проект, а заодно эту самую утилиту настроим. Для добавления утилиты в VB начните новый exe-проект и создайте в нем стандартный модуль Модуль1. Откройте модуль. В меню VB "Добавления" (Add-Ins) шелкните по "Менеджеру Дополнений" (Add-In Manager) рис.1.

Рисунок 1

У тебя появится "Менеджер Дополнений", в котором надо выбрать строку VB 6 API Viewer. Не забудь поставить две галочки "Загружено/Выгружено" и "Загрузить при запуске" (рис. 2). Тогда у тебя при каждом запуске VB будет присутствовать эта утилита. А поскольку ты читаешь эту главу, значит решился взяться за API всерьез, и эта утилита должна стать твоей любимой.Рисунок 2.

После этих манипуляций у тебя в меню "Добавления" появится новая строка "API Viewer" (Рис.3). Вот по ней и щелкни.Рисунок 3.

И перед тобой открывается искомая, замечательная утилита. Однако в нее надо загрузить этот самый файл Win32API.txt, чтоб было, на что посмотреть. Выбери в меню File строку Load Text File и в открывшемся окне найди этот файл. Теперь, естественно, жми Open. В поле Available Items у тебя появился список доступных API. Если нам надо, например, записать в наш проект функцию GetDesktopWindow, то мы в поле Type the first... пишем, конечно, первые буквы функции (getdes) и вот она, выехала, прямо перед нами. Щелкаем по кнопке Add и полное объявление функции появляется в поле Selected Items (рис 4). Жмем кнопку Copy (при этом объявление забирается в буфер), а потом особо не напрягаясь Insert. У тебя даже спросят, в Модуль1.bas ли надо вставлять функцию. Ты жмешь OK и у тебя в модуле готовое правильное объявление. Заметьте, что мы объявляем функцию в модуле, поэтому с ключевым словом Public (помечена строка Public). А вот если бы мы объявляли функцию в форме, то надо было бы пометить строчку Private.Рисунок 4.

Ну тут можно добавить, что для быстроты поиска можно преобразовать текстовой файл в базу (.mdf), но тогда и грузить надо базу ("Load Database File"). А еще, для того, чтобы последний файл грузился автоматически, поставь галочку в меню View в строке "Load Last File".

Ну вот теперь мы полностью готовы к исследованию API, которое начнется в следующей статье.

Copyright © 2005 4us

Сайт создан в системе uCoz

vbzero.narod.ru

Пошаговое руководство. Вызов API Windows (Visual Basic)

  • 07/20/2015
  • Время чтения: 15 мин
  • Соавторы

В этой статье

API-интерфейсы Windows, библиотеки динамической компоновки (DLL), которые являются частью операционной системы Windows.Windows APIs are dynamic-link libraries (DLLs) that are part of the Windows operating system. Они используются для выполнения задач при очень трудно написать собственную процедуру.You use them to perform tasks when it is difficult to write equivalent procedures of your own. Например, Windows предоставляет функцию с именем FlashWindowEx , позволяющий изменять строку заголовка приложения от светлые и темные оттенки.For example, Windows provides a function named FlashWindowEx that lets you make the title bar for an application alternate between light and dark shades.

Преимущество использования интерфейсов API Windows в коде является то, что это может сократить время разработки, так как они содержат множество полезных функций, которые уже записаны и ждут.The advantage of using Windows APIs in your code is that they can save development time because they contain dozens of useful functions that are already written and waiting to be used. Недостатком является то, что API-интерфейсы Windows может быть трудно работать с и не реагирует, когда что-то пошло.The disadvantage is that Windows APIs can be difficult to work with and unforgiving when things go wrong.

API-интерфейсы Windows представляют собой специальную категорию взаимодействия.Windows APIs represent a special category of interoperability. API-интерфейсы Windows следует использовать управляемый код, не имеют встроенных библиотек и использовать типы данных, которые отличаются от тех, которые используются в Visual Studio.Windows APIs do not use managed code, do not have built-in type libraries, and use data types that are different than those used with Visual Studio. Из-за этих различий и так как API-интерфейсы Windows не являются объектами COM, взаимодействие с API-интерфейсов Windows и .NET Framework.NET Framework выполняется с помощью платформы неуправляемого кода, или PInvoke.Because of these differences, and because Windows APIs are not COM objects, interoperability with Windows APIs and the .NET Framework.NET Framework is performed using platform invoke, or PInvoke. Неуправляемого кода — это служба, позволяющая управляемому коду вызывать неуправляемые функции, реализованные в библиотеках DLL.Platform invoke is a service that enables managed code to call unmanaged functions implemented in DLLs. Дополнительные сведения см. в разделе использование неуправляемых функций DLL.For more information, see Consuming Unmanaged DLL Functions. Можно использовать PInvoke в Visual Basic с помощью Declare инструкции или применение DllImport атрибут к пустой процедуре.You can use PInvoke in Visual Basic by using either the Declare statement or applying the DllImport attribute to an empty procedure.

Вызовы Windows API были важной частью программирования в прошлом Visual Basic, но редко необходимы в Visual Basic .NET.Windows API calls were an important part of Visual Basic programming in the past, but are seldom necessary with Visual Basic .NET. По возможности следует использовать управляемый код из .NET Framework.NET Framework для выполнения задач, а не вызовы Windows API.Whenever possible, you should use managed code from the .NET Framework.NET Framework to perform tasks, instead of Windows API calls. Это пошаговое руководство содержит сведения для таких случаев, в которых использование API-интерфейсы Windows не требуется.This walkthrough provides information for those situations in which using Windows APIs is necessary.

Примечание

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях.Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. Это зависит от имеющегося выпуска Visual Studio и используемых параметров.The Visual Studio edition that you have and the settings that you use determine these elements. Дополнительные сведения см. в разделе Персонализация среды IDE.For more information, see Personalizing the IDE.

Объявить с помощью вызовов APIAPI Calls Using Declare

Является наиболее распространенным способом для вызова Windows API с помощью Declare инструкции.The most common way to call Windows APIs is by using the Declare statement.

Объявление процедуры DLLTo declare a DLL procedure
  1. Определить имя функции, которые вы хотите вызвать, ее аргументы, типы аргументов и возвращают значение, а также имя и расположение библиотеки DLL, которая его содержит.Determine the name of the function you want to call, plus its arguments, argument types, and return value, as well as the name and location of the DLL that contains it.

    Примечание

    Полные сведения об API-интерфейсы Windows см. в документации Win32 SDK, в Windows API пакета SDK для платформы.For complete information about the Windows APIs, see the Win32 SDK documentation in the Platform SDK Windows API. Дополнительные сведения о константах, использующих API-интерфейсы Windows проверьте файлы заголовков, такие как Windows.h, входящего в пакет SDK платформы.For more information about the constants that Windows APIs use, examine the header files such as Windows.h included with the Platform SDK.

  2. Откройте новый проект приложения Windows, щелкнув New на файл меню, а затем щелкнув проекта.Open a new Windows Application project by clicking New on the File menu, and then clicking Project. Откроется диалоговое окно Новый проект .The New Project dialog box appears.

  3. Выберите приложения Windows в списке шаблонов проектов Visual Basic.Select Windows Application from the list of Visual Basic project templates. Откроется новый проект.The new project is displayed.

  4. Добавьте следующий Declare работать либо на класс или модуль, в котором вы хотите использовать библиотеку DLL:Add the following Declare function either to the class or module in which you want to use the DLL:

    Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" ( ByVal hWnd As Integer, ByVal txt As String, ByVal caption As String, ByVal Typ As Integer) As Integer

Части оператор DeclareParts of the Declare Statement

Declare Инструкция включает в себя следующие элементы.The Declare statement includes the following elements.

Модификатор AutoAuto modifier

Auto Модификатор указывает среде выполнения для преобразования строки, на основе имени метода в соответствии с общих правил языка среды выполнения (или псевдоним, если указано).The Auto modifier instructs the runtime to convert the string based on the method name according to common language runtime rules (or alias name if specified).

Ключевые слова lib и псевдонимLib and Alias keywords

Следующее имя Function ключевое слово — это имя, программа использует для доступа к импортируемой функции.The name following the Function keyword is the name your program uses to access the imported function. Он может совпадать с действительное имя вызываемой функции, или можно использовать любой допустимым именем процедуры и затем использовали Alias ключевое слово, чтобы указать действительное имя вызываемой функции.It can be the same as the real name of the function you are calling, or you can use any valid procedure name and then employ the Alias keyword to specify the real name of the function you are calling.

Укажите Lib ключевое слово, за которым следует имя и расположение библиотеки DLL, содержащей функцию, вы вызываете.Specify the Lib keyword, followed by the name and location of the DLL that contains the function you are calling. Необходимо указать путь для файлов в файловой системы Windows.You do not need to specify the path for files located in the Windows system directories.

Используйте Alias ключевое слово, имя функции при вызове не является допустимым именем процедуры Visual Basic или конфликтует с именем других элементов в приложении.Use the Alias keyword if the name of the function you are calling is not a valid Visual Basic procedure name, or conflicts with the name of other items in your application. Alias Указывает правильное имя вызываемой функции.Alias indicates the true name of the function being called.

Аргумент и объявлениям типов данныхArgument and Data Type Declarations

Объявите аргументы и их типы данных.Declare the arguments and their data types. Эта часть может оказаться сложной задачей, поскольку типы данных, которые использует Windows не соответствуют типам данных Visual Studio.This part can be challenging because the data types that Windows uses do not correspond to Visual Studio data types. Visual Basic выполняет большую часть работы автоматически путем преобразования аргументов в совместимые типы данных, этот процесс называется маршалинг.Visual Basic does a lot of the work for you by converting arguments to compatible data types, a process called marshaling. Можно явно управлять маршалингом аргументов с помощью MarshalAsAttribute атрибутом, определенным в System.Runtime.InteropServices пространства имен.You can explicitly control how arguments are marshaled by using the MarshalAsAttribute attribute defined in the System.Runtime.InteropServices namespace.

Примечание

Предыдущие версии Visual Basic позволяет объявлять параметры As Any, то есть, данные любого типа может использоваться.Previous versions of Visual Basic allowed you to declare parameters As Any, meaning that data of any data type could be used. Visual Basic необходимо использовать определенный тип данных для всех Declare инструкций.Visual Basic requires that you use a specific data type for all Declare statements.

Константы Windows APIWindows API Constants

Некоторые аргументы являются сочетаниями констант.Some arguments are combinations of constants. Например MessageBox API, приведенных в этом руководстве принимает целочисленный аргумент вызывается Typ , определяет, как отображается окно сообщения.For example, the MessageBox API shown in this walkthrough accepts an integer argument called Typ that controls how the message box is displayed. Числовое значение из этих констант можно определить с помощью проверки #define инструкций в файле WinUser.h.You can determine the numeric value of these constants by examining the #define statements in the file WinUser.h. Числовые значения обычно отображаются в шестнадцатеричном формате, поэтому может потребоваться добавить их и преобразовать в десятичное с помощью калькулятора.The numeric values are generally shown in hexadecimal, so you may want to use a calculator to add them and convert to decimal. К примеру, если нужно объединить константы для стиля восклицательный знак MB_ICONEXCLAMATION 0x00000030 и Да/Нет стиля MB_YESNO 0x00000004, можно добавить номера и получить результат 0x00000034, или 52 десятичное.For example, if you want to combine the constants for the exclamation style MB_ICONEXCLAMATION 0x00000030 and the Yes/No style MB_YESNO 0x00000004, you can add the numbers and get a result of 0x00000034, or 52 decimal. Несмотря на то, что можно использовать непосредственно десятичное число, лучше объявить эти значения в приложении как константы, а также объединять их с помощью Or оператор.Although you can use the decimal result directly, it is better to declare these values as constants in your application and combine them using the Or operator.

Для объявления констант для вызовов Windows APITo declare constants for Windows API calls
  1. См. в документации для вызова функции Windows.Consult the documentation for the Windows function you are calling. Определите имя константы, используемые в нем и имя файла .h, который содержит числовые значения для этих констант.Determine the name of the constants it uses and the name of the .h file that contains the numeric values for these constants.

  2. Используйте текстовый редактор, например Блокнот, чтобы просмотреть содержимое файла заголовка (.h) и найдите значения, связанные с константами, которую вы используете.Use a text editor, such as Notepad, to view the contents of the header (.h) file, and find the values associated with the constants you are using. Например MessageBox API использует константа MB_ICONQUESTION Показать знак вопроса в окне сообщения.For example, the MessageBox API uses the constant MB_ICONQUESTION to show a question mark in the message box. Определение MB_ICONQUESTION в WinUser.h и выглядит следующим образом:The definition for MB_ICONQUESTION is in WinUser.h and appears as follows:

    #define MB_ICONQUESTION 0x00000020L

  3. Добавьте соответствующие Const инструкции, чтобы класс или модуль, чтобы сделать эти константы доступными для приложения.Add equivalent Const statements to your class or module to make these constants available to your application. Пример:For example:

    Const MB_ICONQUESTION As Integer = &h30 Const MB_YESNO As Integer = &h5 Const IDYES As Integer = 6 Const IDNO As Integer = 7
Вызов процедуры DLLTo call the DLL procedure
  1. Добавьте кнопку с именем Button1 запуска форму для проекта и дважды щелкните его, чтобы просмотреть ее код.Add a button named Button1 to the startup form for your project, and then double-click it to view its code. Обработчик событий для кнопки отображается.The event handler for the button is displayed.

  2. Добавьте код для Click обработчик событий для кнопки, вы добавили, чтобы вызвать процедуру и предоставьте соответствующие аргументы:Add code to the Click event handler for the button you added, to call the procedure and provide the appropriate arguments:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Stores the return value. Dim RetVal As Integer RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox", MB_ICONQUESTION Or MB_YESNO) ' Check the return value. If RetVal = IDYES Then MsgBox("You chose Yes") Else MsgBox("You chose No") End If End Sub
  3. Запустите проект, нажав клавишу F5.Run the project by pressing F5. Окно сообщения отображается с обоими Да и нет кнопками.The message box is displayed with both Yes and No response buttons. Нажмите одну из них.Click either one.

Маршалинг данныхData Marshaling

Visual Basic автоматически преобразует типы данных параметров и возвращаемых значений для вызовов Windows API, но можно использовать MarshalAs атрибута в явном виде неуправляемые типы данных, которые ожидает API.Visual Basic automatically converts the data types of parameters and return values for Windows API calls, but you can use the MarshalAs attribute to explicitly specify unmanaged data types that an API expects. Дополнительные сведения о маршалинге взаимодействия см. в разделе маршалинг взаимодействия.For more information about interop marshaling, see Interop Marshaling.

Использовать Declare и MarshalAs в вызов APITo use Declare and MarshalAs in an API call
  1. Определить имя функции, необходимо вызвать ее аргументы, типы данных и возвращают значение.Determine the name of the function you want to call, plus its arguments, data types, and return value.

  2. Для упрощения доступа к MarshalAs атрибута, добавьте Imports в начало кода для класса или модуля, как показано в следующем примере:To simplify access to the MarshalAs attribute, add an Imports statement to the top of the code for the class or module, as in the following example:

    Imports System.Runtime.InteropServices
  3. Добавьте прототип функции для импортированной функции в класс или модуль, вы используете и применить MarshalAs атрибут параметров или возвращаемого значения.Add a function prototype for the imported function to the class or module you are using, and apply the MarshalAs attribute to the parameters or return value. В следующем примере вызов API, который ожидает, что тип void* маршалируется как AsAny:In the following example, an API call that expects the type void* is marshaled as AsAny:

    Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" ( ByVal x As Short, <MarshalAsAttribute(UnmanagedType.AsAny)> ByVal o As Object)

Вызовы API, с помощью DllImportAPI Calls Using DllImport

DllImport Атрибут предоставляет второй способ вызова функций в библиотеках DLL без библиотеки типов.The DllImport attribute provides a second way to call functions in DLLs without type libraries. DllImport с помощью приблизительно соответствует Declare инструкции, но обеспечивает больший контроль над процессом вызова функций.DllImport is roughly equivalent to using a Declare statement but provides more control over how functions are called.

Можно использовать DllImport с большинства API Windows вызывает до тех пор, пока вызов связан общий (иногда называется статический) метод.You can use DllImport with most Windows API calls as long as the call refers to a shared (sometimes called static) method. Нельзя использовать методы, которым требуется экземпляр класса.You cannot use methods that require an instance of a class. В отличие от Declare инструкций, DllImport нельзя использовать вызовы MarshalAs атрибута.Unlike Declare statements, DllImport calls cannot use the MarshalAs attribute.

Для вызова API Windows, используя атрибут DllImportTo call a Windows API using the DllImport attribute
  1. Откройте новый проект приложения Windows, щелкнув New на файл меню, а затем щелкнув проекта.Open a new Windows Application project by clicking New on the File menu, and then clicking Project. Откроется диалоговое окно Новый проект .The New Project dialog box appears.

  2. Выберите приложения Windows в списке шаблонов проектов Visual Basic.Select Windows Application from the list of Visual Basic project templates. Откроется новый проект.The new project is displayed.

  3. Добавьте кнопку с именем Button2 форму запуска.Add a button named Button2 to the startup form.

  4. Дважды щелкните Button2 чтобы открыть представление кода для формы.Double-click Button2 to open the code view for the form.

  5. Для упрощения доступа к DllImport, добавьте Imports в начало кода для класса формы запуска:To simplify access to DllImport, add an Imports statement to the top of the code for the startup form class:

    Imports System.Runtime.InteropServices
  6. Объявите пустую функцию выше End Class инструкции для формы и имя функции MoveFile.Declare an empty function preceding the End Class statement for the form, and name the function MoveFile.

  7. Применить Public и Shared модификаторы объявления функции, а также задавать параметры для MoveFile на основе аргументов в функции Windows API используется:Apply the Public and Shared modifiers to the function declaration and set parameters for MoveFile based on the arguments the Windows API function uses:

    Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean ' Leave the body of the function empty. End Function

    Функция может иметь любое допустимое имя процедуры; DllImport атрибут указывает имя библиотеки DLL.Your function can have any valid procedure name; the DllImport attribute specifies the name in the DLL. Он также обрабатывает маршалинг взаимодействия для параметров и возвращаемых значений, поэтому вы можете выбрать типы данных Visual Studio, которые похожи на данные типах, которые использует API.It also handles interoperability marshaling for the parameters and return values, so you can choose Visual Studio data types that are similar to the data types the API uses.

  8. Применить DllImport атрибут пустой функции.Apply the DllImport attribute to the empty function. Первый параметр — это имя и расположение библиотеки DLL, содержащей функцию, которую вы вызываете.The first parameter is the name and location of the DLL containing the function you are calling. Необходимо указать путь для файлов в файловой системы Windows.You do not need to specify the path for files located in the Windows system directories. Второй параметр — именованный аргумент, который задает имя функции в Windows API.The second parameter is a named argument that specifies the name of the function in the Windows API. В этом примере DllImport атрибут приводит вызовы MoveFile должно перенаправляться в MoveFileW в KERNEL32. БИБЛИОТЕКА DLL.In this example, the DllImport attribute forces calls to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL. MoveFileW Метод копирует файл из пути src путь dst.The MoveFileW method copies a file from the path src to the path dst.

    <DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean ' Leave the body of the function empty. End Function
  9. Добавьте код для Button2_Click обработчик событий для вызова функции:Add code to the Button2_Click event handler to call the function:

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt") If RetVal = True Then MsgBox("The file was moved successfully.") Else MsgBox("The file could not be moved.") End If End Sub
  10. Создайте файл с именем Test.txt и поместите его в каталог C:\Tmp на жестком диске.Create a file named Test.txt and place it in the C:\Tmp directory on your hard drive. При необходимости создайте каталог Tmp.Create the Tmp directory if necessary.

  11. Нажмите клавишу F5 для запуска приложения.Press F5 to start the application. Появится главная форма.The main form appears.

  12. Нажмите кнопку Button2.Click Button2. Если файл можно переместить, отображается сообщение, «файл был перемещен успешно».The message "The file was moved successfully" is displayed if the file can be moved.

См. такжеSee Also

DllImportAttributeMarshalAsAttributeОператор DeclareDeclare StatementAutoAutoAliasAliasCOM-взаимодействиеCOM InteropСоздание прототипов в управляемом кодеCreating Prototypes in Managed CodeМаршалинг делегата как метода обратного вызоваMarshaling a Delegate as a Callback Method

docs.microsoft.com

Учимся работать с файлами через Windows API

Из предыдущих постов, посвященных WinAPI, мы научились настраивать Visual Studio и узнали, как в нем писать простые консольные приложения. Следующим маленьким шажком в изучении WinAPI будет освоение работы с файлами.

Для этого нелегкого дела нам понадобятся следующие процедуры:

CreateFile(szName, dwAccess, dwShareMode, lpSecurityAttributes,           dwCreationDisposition, dwFlags, hTemplateFile);

В Windows для того, чтобы открыть или создать файл, нужно вызвать процедуру, имеющую целых семь аргументов. К счастью, большинство из них приходится использовать крайне редко. Аргумент szName задает имя файла, а dwAccess — желаемый доступ к файлу, обычно это GENERIC_READ, GENERIC_WRITE или оба значения, объединенные логическим или. Параметр dwShareMode определяет, что могут делать с файлом другие процессы, пока мы с ним работаем. Возможные значения — FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_DELETE и их комбинации, однако часто этот параметр просто устанавливают в ноль. Параметр dwCreationDisposition определяет, как именно мы хотим открыть файл, может быть, например, CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING, OPEN_ALWAYS. О семантике этого хозяйства нетрудно догадаться самостоятельно. С помощью dwFlags можно указать дополнительные свойства файла, например, хранить ли его в зашифрованном или сжатом виде, или сказать, что файл является скрытым, временным или системным. Обычно сюда передают FILE_ATTRIBUTE_NORMAL. Наконец, про lpSecurityAttributes и hTemplateFile сейчас знать не нужно, сюда можно смело передавать NULL.

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

ReadFile(hFile, lpBuff, dwBuffSize, &dwCount, NULL);

Чтение из файла в буфер lpBuff размером dwBuffSize. В переменную dwCount записывается реальное количество прочитанных байт. Последний опциональный аргумент называется lpOverlapped и о нем сейчас знать не нужно.

WriteFile(hFile, lpBuff, dwBuffSize, &dwCount, NULL);

Аргументы и семантика процедуры WriteFile полностью аналогичны ReadFile.

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

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

#include <windows.h>

#define MAX_TRIAL_RUNS 5

const TCHAR szCounterFileName[] = L"counter.dat";const TCHAR szMsgTmpl[] = L"Вы запустили программу в %d-й раз. %s.";const TCHAR szCheckOk[] = L"Все в порядке, продолжайте работу";const TCHAR szCheckFailed[] = L"Триал истек, купите полную версию";

DWORD ReadCounter() {  DWORD dwCounter, dwTemp;  HANDLE hFile = CreateFile(szCounterFileName, GENERIC_READ, 0, NULL,                           OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  if(INVALID_HANDLE_VALUE == hFile) {    return 1;  }  ReadFile(hFile, &dwCounter, sizeof(dwCounter), &dwTemp, NULL);  if(sizeof(dwCounter) != dwTemp) {    CloseHandle(hFile);    return 1;  }  CloseHandle(hFile);  return dwCounter;}

VOID WriteCounter(DWORD dwCounter) {  DWORD dwTemp;  HANDLE hFile = CreateFile(szCounterFileName, GENERIC_WRITE, 0, NULL,                           CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  if(INVALID_HANDLE_VALUE == hFile) {    return;  }  WriteFile(hFile, &dwCounter, sizeof(dwCounter), &dwTemp, NULL);  CloseHandle(hFile);}

int main() {  TCHAR szMsg[256];  DWORD dwCounter = ReadCounter();  LPCWSTR lpCheckResult = dwCounter > MAX_TRIAL_RUNS ?                          szCheckFailed : szCheckOk;  wsprintf(szMsg, szMsgTmpl, dwCounter, lpCheckResult);  MessageBox(0, szMsg, L"Сообщение", 0);

  if(dwCounter <= MAX_TRIAL_RUNS) {    WriteCounter(dwCounter+1);  }

  ExitProcess(0);}

Как обычно, программа также успешно компилируется при помощи MinGW и запускается под Wine.

В качестве домашнего задания можете попробовать модифицировать программу так, чтобы она выводила время, когда производились все ее запуски. Для этого вам понадобятся процедуры GetLocalTime, SetFilePointer и GetFileSizeEx. Если это задание покажется вам слишком простым, попробуйте найти информацию о том, как при помощи процедур, упомянутых в этой заметке, (1) написать консольное приложение и (2) открыть диск C: на чтение, словно он является обычным файлом.

Если у вас есть дополнения или возникли вопросы, смелее пишите комментарии, не стесняйтесь!

Дополнение: Рекурсивный поиск файлов с использованием WinAPI

Метки: C/C++, WinAPI.

eax.me

Разработка программного приложения с использованием интерфейса Windows API

Реферат

Пояснительная записка содержит в себе стр.18, 2 приложения.

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

Объект исследования – использования интерфейса программирования Windows

Метод исследования – изучение литературы, составления и отладка приложений и отдельных модулей на компьютере.

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

Для программной реализации проекта использовалась среда программирования Visual C++ 6.0.

КЛЮЧЕВЫЕ СЛОВА: ПРОЦЕДУРА, ОБРАБОТЧИК, API ФУНКЦИИ, КОНТЕКСТ УСТРОЙСТВА, ХЕНДЛ, КИСТЬ, CALLBACK-ПРОЦЕДУРА, СООБЩЕНИЕ

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

1 АНАЛИЗ, ПОСТАНОВКА ЗАДАЧИ И СФЕРА ЕЕ ПРИМЕНЕНИЯ

2 КРАТКАЯ ХАРАКТЕРИСТИКА ПРОГРАММИРОВАНИЯ ПОД WIN32

3 ОСНОВНАЯ ЧАСТЬ

4 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

4.3 СИСТЕМНЫЕ ТРЕБОВАНИЯ

ЗАКЛЮЧЕНИЕ

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

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

Интерес к персональным компьютерам постоянно растет, а круг их пользователей непрерывно расширяется.

Одновременно развиваются языки программирования . С 1985 года язык С был дополнен возможностями объектно-ориентированного программирования (ООП). Новая версия языка была названа С++. Использования ООП позволило не только определить типы данных пользователя, но и задать операции для этих типов.

На основе языка С++ разработаны визуальные системы С++ BUILDER, VISIAL C++. Использование этих систем позволило значительно упростить создания интерфейса, работу с базами данных и т.д. Несмотря на эти нововведения, по-прежнему программируют на WinAPI, который используется для решения системных задач. Только про его использование позволяет создавать программы, использующие всю мощь Windows, которая является сейчас самой популярной операционной системой.

Компьютерная графика является одним из передовых направлений в области технологий программного обеспечения. Сегодня нет человека имеющего отношения к компьютера, который бы не знал что это такое. Интерфейс программирования (API) для создания графики предоставляется самой операционной системой, точнее ее компонентом называемым “framebuffer”. В операционной системе Windows framebuffer называется GDI, его главная библиотека, предоставляющая программисту функции для программирования, называется gdi32.dll и находится в системном каталоге ОС. GDI предоставляет полный контроль над прорисовкой экранного окна, что предоставляет поистине безграничные возможности программирования внешнего вида программ.

Концепция операционной системы Windows состоит в том, что программа взаимодействует с пользователем в интерактивном режиме. Это реализуется с помощью графических интерфейсов. Windows имеет набор стандартно выглядящих элементов управления и отлаженный механизм работы с ними. Но часто возникает нужда добавить необходимый несуществующий элемент управления или просто изменить внешний вид элемента. Многие программы такие как проигрователи мультимедия еще с времен Windows 95 используют свой графичский интерфейс пользователя для придания большей привлекательности со стороны пользователей. Каждый разработчик пытается вложить в программу что-то свое, необычное, не похожее на остальных. Конечно, функциональность играет основную роль, но удобный и красивый интерфейс не менее важен и проблема это довольно серъезная.

Задача курсовой работы состоит в разработке на языке программирования С++ в среде программирования Microsoft Visual C++ программы для отображения часов реального времени в цифровом и аналоговом виде.

Программа должна обладать следующими функциями:

· Возможность выбора режима отображения часов(аналоговый или цифровой вид)

· Изменение размеров часов

· Изменение цвета фона, на котором рисуются часы

· Изменение цвета цифр-для цифрового вида, цвета стрелок –для аналогового вида

Все Windows-программы начинают выполнение с вызова функции WinMain().

Функция окна

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

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

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

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

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

Хотя она может вызывать для этого одну или несколько API-функций, само действие было инициировано Windows.

Поэтому именно способ взаимодействия с операционной системой через сообщения диктует общий принцип построения всех программ для Windows.

Цикл сообщений

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

Класс окна

Каждое окно в Windows-приложении характеризуется определенными атрибутами, называемыми классом окна . (Здесь понятие “класс” не идентично используемому в С++. Оно, скорее, означает стиль или тип.) В традиционной программе класс окна должен быть определен и зарегистрирован прежде, чем будет создано окно. При регистрации необходимо сообщить Windows, какой вид должно иметь окно и какую функцию оно выполняет. В то же время регистрация класса окна еще не означает создание самого окна. Для этого требуется выполнить дополнительные действия.

Типы данных в Windows

В Windows-программах вообще не слишком широко применяются стандартные типы данных из С или С++, такие как int или char*. Вместо них используются типы данных, определенные в различных библиотечных (header) файлах. Наиболее часто используемыми типами являются HANDLE, HWND, BYTE, WORD, DWORD, UNIT, LONG, BOOL, LPSTR и LPCSTR. Тип HANDLE обозначает 32-разрядное целое, используемое в качестве дескриптора. Есть несколько похожих типов данных, но все они имеют ту же длину, что и HANDLE, и начинаются с литеры Н. Дескриптор – это просто число, определяющее некоторый ресурс. Например, тип HWND обозначает 32-разрядное целое – дескриптор окна. Тип BYTE обозначает 8-разрядное беззнаковое символьное значение, тип WORD – 16-разрядное беззнаковое короткое целое, тип DWORD – беззнаковое длинное целое, тип UNIT - беззнаковое 32-разрядное целое. Тип LONG эквивалентен типу long. Тип BOOL обозначает целое и используется, когда значение может быть либо истинным, либо ложным. Тип LPSTR определяет указатель на строку, а LPCSTR – константный (const) указатель на строку.

Общие концепции программирования графики в Windows

С точки зрения программиста Windows является системой, не зависящей от устройств (device independent). Эту независимость со стороны Windows обеспечивает библиотека GDI32.dll, а со стороны устройства - драйвер этого устройства. С точки зрения программы связующим звеном между программой и устройством является контекст устройства (Device Context - DC). Если программе нужно осуществить обмен с внешним устройством, программа должна оповесить GDI о необходимости подготовить устройство для операции ввода-вывода. После того, как устройство подготовленно, программа получает хэндл контекста устройства, т.е. хэндл структуры, содержащей набор характеристик этого устройства. В этот набор входят: bitmap(битовая карта, изображение), отображаемый в окне, перо для прорисовки линий, кисть, палитра, шрифти т.д. Программа никогда напрямую не обращается к контексту устройства, она обращается к нему опосредствованно, через определенные функции. После того, как все действия произведены, и необходимость в использовании устройства отпала, программа должна освободить контекст устройства, чтобы не занимать память. Есть еще одна причина, из-за которой необходимо освобождать контекст устройства. В системе может существовать одновременно только ограниченное число контекстов устройств. Если контекст устройства не будет освобождаться после операций вывода, то через несколько перерисовок окна система может повиснуть. Так что не стоит забывайть освобождать контексты устройств!

mirznanii.com

Windows API - это... Что такое Windows API?

Windows API (англ. application programming interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Microsoft Windows корпорации «Майкрософт» и совместимой с ними свободной бесплатной операционной системы ReactOS. Является самым прямым способом взаимодействия приложений с Windows и ReactOS. Для создания программ, использующих Windows API, «Майкрософт» выпускает комплект разработчика программного обеспечения, который называется Platform SDK, и содержит документацию, набор библиотек, утилит и других инструментальных средств для разработки.

Общие сведения

Windows API был изначально спроектирован для использования в программах, написанных на языке Си или C++. Работа через Windows API — это наиболее близкий к системе способ взаимодействия с ней из прикладных программ. Более низкий уровень доступа, необходимый только для драйверов устройств, в текущих версиях Windows предоставляется через Windows Driver Model.

Версии

  • Win16 — первая версия Windows API для 16-разрядных версий Windows. Изначально назывался просто Windows API, затем стал называться Win16 для отличия от Win32.
  • Win32s — подмножество Win32, устанавливаемое на семейство 16-разрядных систем Windows 3.x, и реализующее ограниченный набор функций Win32 API для этих систем.
  • Win32 — 32-разрядный API для современных версий Windows. Самая популярная ныне версия. Базовые функции этого API реализованы в динамически подключаемых библиотеках kernel32.dll и advapi32.dll; базовые модули графического интерфейса пользователя — в user32.dll и gdi32.dll. Win32 появился вместе с Windows NT и затем был перенесён в несколько ограниченном виде в системы серии Windows 9x. В современных версиях Windows, происходящих от Windows NT, работу Win32 GUI обеспечивают два модуля: csrss.exe (процесс исполнения клиент-сервер), работающий в пользовательском режиме, и win32k.sys в режиме ядра. Работу же системных Win32 API обеспечивает ядро — ntoskrnl.exe.
  • Win64 — 64-разрядная версия Win32, содержащая дополнительные функции для использования на 64-разрядных компьютерах. Win64 API можно найти только в 64-разрядных версиях Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows Server 2008 R2, Windows 7 и Windows 8.

Технологии, доступные через Windows API

Алфавитный список технологий, доступных через Windows API:

  • Система контроля и управления доступом.
  • Microsoft Active Accessibility.
  • Active Directory.
  • Active Server Pages.
  • ActiveX.
  • Автоматизация.
  • Фоновая интеллектуальная служба передачи (BITS).
  • Bluetooth.
  • CDO.
  • Certificate Enrollment Control.
  • Certificate Services.
  • Collaboration Data Objects.
  • Component Object Model
  • COM Plus.
  • Common Controls.
  • Криптография.
  • Debugging and Error Handling.
  • Device I/O.
  • Распределённая файловая система.
  • DLL, процессы и многопоточность.
  • Domain Name System.
  • Dynamic Host Configuration Protocol (DHCP).
  • Extensible Authentication Protocol (EAP).
  • Extensible Markup Language (XML) и парсер MSXML.
  • Fax Service.
  • Групповая политика.
  • HTTP.
  • ICS и ICF.
  • Image Color Management (ICM)
  • Image Mastering API (IMAPI)
  • Indexing Service
  • Infrared Data Association (IrDa)
  • Internet Authentication Service (IAS)
  • Internet Connection Sharing and Firewall (ICSF)
  • Internet Explorer
  • Internet Information Services (IIS)
  • Internet Protocol Helper (IP Helper)
  • Interprocess Communications
  • Lightweight Directory Access Protocol (LDAP)
  • LSA Authentication
  • LSA Policy
  • Memory Management
  • Message Queuing (MSMQ)
  • Messaging Application Programming Interface (MAPI)
  • Microsoft .NET Passport
  • Microsoft Agent
  • Microsoft Data Access Components (MDAC)
  • Microsoft Interface Definition Language (MIDL)
  • Microsoft Management Console (MMC)
  • Microsoft Transaction Server (MTS)
  • Multicast Address Dynamic Client Allocation Protocol (MADCAP)
  • Multicast Group Manager
  • National Language Support
  • NetMeeting
  • NetShell
  • Network Load Balancing Provider
  • Network Management
  • Network Monitor
  • Network Provider API
  • OLE DB
  • OLE DB Provider for Internet Publishing
  • OnNow
  • Open Database Connectivity (ODBC)
  • OpenGL
  • Password Filters
  • PC Health
  • Performance Monitoring
  • Plug and Play и Universal Plug and Play
  • Power Management
  • Quality of Service (QoS)
  • Real-time Communications (RTC) Client //ссылка ведет не на ту статью
  • Remote Access Service (RAS)
  • Remote Procedure Call (имеется в виду служба RPC Service)
  • Removable Storage Manager (RSM)
  • Routing and Remote Access Service (RRAS)
  • Routing Table Manager Version 1 (RTMV1)
  • Routing Table Manager Version 2 (RTMV2)
  • Security Support Provider Interface (SSPI)
  • Server Cluster API
  • Server Data Objects (SDO)
  • Service Security Attachments
  • Setup API
  • Shell (имеется в виду Explorer Shell)
  • Side-by-side Assemblies
  • Simple Network Management Protocol (SNMP)
  • Smart Card
  • Still Image
  • Storage и Structured Storage
  • Synchronization Manager
  • System.DirectoryServices
  • System Event Notification Service (SENS)
  • System Restore
  • Tablet PC
  • Task Scheduler
  • Telephony Application Programming Interface (TAPI) 2.2
  • Telephony Application Programming Interface (TAPI) 3
  • Telephony Service Provider Interface (TSPI и MSPI)
  • Terminal Services
  • Text Services Framework
  • Unicode (и MSLU)
  • Universal Description, Discovery, and Integration (UDDI)
  • Video for Windows
  • Windows Clustering
  • Windows File Protection
  • Windows GDI
  • Windows GDI+
  • Windows Image Acquisition (WIA)
  • Windows Installer
  • Windows Management Instrumentation (WMI)
  • Windows Multimedia
  • Windows Sockets
  • Windows System Information
  • Windows User Interface
  • Winlogon и Gina
  • WinSNMP

См. также

Ссылки

Литература

  • Гэри Неббет Справочник по базовым функциям API Windows NT/2000 = Windows NT/2000 Native API Reference. — М.: «Вильямс», 2002. — С. 528. — ISBN 1-57870-199-6

dic.academic.ru