ПОНЯТНО О Visual Basic NET (том 3)

       

Windows API


Классы библиотеки классов .NET Framework обладают множеством методов, пользуясь которыми программист выполняет те или иные действия над элементами проектируемого приложения. Операционная система Windows тоже обладает множеством функций, пользуясь которыми программист может выполнять действия над элементами Windows. Это множество функций Windows называется Windows API. Многие функции Windows API позволяют выполнять действия, недоступные методам библиотеки классов .NET Framework. Эти функции относятся скорее к операционной системе Windows, а не к VB. Например, это перезагрузка компьютера или установка фона рабочего стола. VB предоставляет возможность прямо из проекта пользоваться функциями Windows API. Однако делать это не так просто, как использовать функции библиотеки классов .NET Framework.

Функции Windows API расположены в библиотеках динамической компоновки – файлах с расширением dll.

Использование в VB функций Windows API я проиллюстрирую на двух примерах.

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

Создайте проект с кнопкой. Вот код:

Declare  Function  Звук  Lib  "User32"  Alias  "MessageBeep" (ByVal A As Long)  As Long

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Звук(-1)

End Sub

Запустите проект. Нажмите кнопку – раздастся наш знакомый Beep.

Пояснения: Первая строка кода объявляет внешнюю

для VB функцию из библиотеки динамической компоновки. Об этом говорит ключевое слово Declare. Мы должны заранее знать точное имя этой функции и указать его в двойных кавычках после ключевого слова Alias. Мы должны заранее знать имя библиотеки динамической компоновки, в которую входит нужная нам функция, и указать его в двойных кавычках после ключевого слова Lib. Мы можем для собственного удобства придумать другое имя для этой функции, которым и будем пользоваться в проекте (я придумал Звук). Мы должны знать заранее смысл и тип параметров функции и указать их в объявлении. У нас это единственный параметр типа Long, который определяет конкретный звук. Для звука Beep этот параметр равен  -1.




Итак, как видите, многое нужно знать заранее. А откуда эти знания взять?

Определяем свободное место на диске. В библиотеке kernel32.dll  Windows API имеется функция GetDiskFreeSpaceA, при помощи которой можно определить свободное место на диске. Создайте проект с кнопкой. Вот код:

Declare Function Свободное_место Lib "kernel32.dll" Alias "GetDiskFreeSpaceA" _

             (ByVal Диск As String, ByRef Секторов_в_кластере As Integer, ByRef Байтов_в_секторе As Integer, _

             ByRef Свободно_кластеров As Integer, ByRef Всего_кластеров As Integer) As Integer

Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click

    Dim Секторов_в_кластере, Байтов_в_секторе, Свободно_кластеров, Всего_кластеров As Integer

    Свободное_место("E:\", Секторов_в_кластере, Байтов_в_секторе, Свободно_кластеров, Всего_кластеров)

    Debug.WriteLine(Секторов_в_кластере)

    Debug.WriteLine(Байтов_в_секторе)

    Debug.WriteLine(Свободно_кластеров)

    Debug.WriteLine(Всего_кластеров)

    Debug.WriteLine("Свободно байтов - " &   _

CLng(Свободно_кластеров) * Секторов_в_кластере * Байтов_в_секторе)

End Sub

Запустите проект. Нажмите кнопку. VB напечатает:

8

512

6313557

10004470

Свободно байтов - 25860329472

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

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

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

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


Содержание раздела