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

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

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

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

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

Примечание.

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

Вызовы API с помощью объявления

Наиболее распространенным способом вызова API Windows является использование инструкции Declare .

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

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

    Примечание.

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

  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 указывает среде выполнения преобразовать строку на основе имени метода в соответствии с правилами cl language runtime (или псевдонимом, если указано).

Ключевое слово lib и alias

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

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

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

Объявления типа аргументов и типов данных

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

Примечание.

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

Константы API Windows

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

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

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

    #define MB_ICONQUESTION 0x00000020L

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

    Const MB_ICONQUESTION As Integer = &H20
    Const MB_YESNO As Integer = &H4
    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 автоматически преобразует типы данных параметров и возвращаемые значения для вызовов API Windows, но атрибут можно использовать MarshalAs для явного указания неуправляемых типов данных, ожидаемых API. Дополнительные сведения о маршалинге взаимодействия см. в разделе "Маршалинг взаимодействия".

Использование объявлений и маршалов в вызове API
  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)
    

Вызовы API с помощью DllImport

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

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

Вызов API Windows с помощью атрибута 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 основе аргументов, которые использует функция API Windows:

    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. Второй параметр — это именованный аргумент, указывающий имя функции в API Windows. В этом примере DllImport атрибут принудительно перенаправит MoveFileW вызовы MoveFile к 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. Нажмите кнопку 2. Сообщение "Файл был успешно перемещен" отображается, если файл можно переместить.

См. также