Использование API-функций в Visual Basic

Домой Наверх Предыдущий

Определение текущего пользователя

В этом примере мы посмотрим, как можно выяснить имя текущего пользователя Windows.

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

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

Итак, для включения в программу такой возможности сделайте следующие шаги:

1.Создайте обычный проект типа Standard EXE и сохраните его в некоторой папке.

2.Добавте на форму Form1 стандартную кнопку. При нажатии на неё как раз и появится MsgBox с именем текущего пользователя (т. е. с Вами самими в данном случае).

3.Используя "API Text Viewer", добавьте в Вашу программу объявления для API-функции GetUserName

4.Вставьте в обработчик события Click Вашей кнопки следующий код:

  Dim strUserName As String
  Dim lngResult As Long
  strUserName = String(100, 0)
  lngResult = GetUserName(strUserName, 99)
  MsgBox strUserName

5.Запустите Вашу программу. Ура, она действует! В MsgBox'е показывается Ваше имя!

Теперь о подводных камнях, которые Вас могут поджидать при использовании в Visual Basic'е строк в API-функциях. Обратите внимание на строчку

  strUserName = String(100, 0)

Как известно, функция String возвращает строку с длиной равной своему первому аргументу. Т. е. в данном примере после этого оператора в строке strUserName будет 100 символов. Если Вы не напишете этот оператор (попробуйте, скажем, просто закомментировать его и запустить программу), то строка strUserName будет нулевой длины . И тогда в следующей строке кода:

  lngResult = GetUserName(strUserName, 99)

в нашу переменную strUserName (нулевой длины!) якобы запишется имя пользователя. Но при этом длина переменной strUserName автоматически не увеличится! Таким образом, в этом случае в переменную strUserName фактически ничего не запишется.

Запомните!

API-функции автоматически не выделяют память под строки! Вы должны позаботиться об этом сами.

Теперь посмотрим на другие подводные камни, которые ожидают Вас при использовании API-функций. Давайте теперь изменим нашу программу так, чтобы она при загрузке анализировала текущего пользователя и выдавала MsgBox с приветствием "Здравствуй, Отто Юльевич" в случае если входит пользователь Отто Юльевич и MsgBox с приветствием "Увы, продолжать работу невозможно" если имя текущего пользователя не Отто Юльевич (разумеется, Вы должны использовать своё имя вместо имени Отто Юльевич). Кроме того, в последнем случае программа должна заканчивать свою работу.

Первое, что приходит в голову - это написать следующие строки:

Private Sub Form_Load()
  Dim strUserName As String
  Dim lngResult As Long
  strUserName = String(100, 0)
  lngResult = GetUserName(strUserName, 99)
  If strUserName = "Здравствуй, Отто Юльевич" Then
    MsgBox strUserName
  Else
    MsgBox "Увы, продолжать работу невозможно"
    End
  End If
End Sub

Так и сделаем (разумеется, Вам необходимо изменить текст программы с учётом Вашего имени).

Запускаем её. И что? Вместо ожидаемого приветствия нас самих программа выдаёт нам MsgBox с сообщением "Увы, продолжать работу невозможно" и выходит! Значит, что-то мы сделали не так.

Дело здесь вот в чём. API-функция GetUserName запишет в соответствующей строке нашего кода в переменную strUserName имя текущего пользователя, но при этом строка эта не сократиться. Т. е. как мы выделили для неё 100 символов, так они там и будет. И в строчке кода

If strUserName = "Здравствуй, Отто Юльевич" Then

мы сравниваем строку strUserName (длина которой сто символов) и строку "Здравствуй, Отто Юльевич" (в которой меньше ста символов). Понятно, что результат сравнения в этом случае всегда будет false, несмотря на то, то первая часть у этих строк явно совпадает.

Запомните!

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

Таким образом, перед нами встаёт задача по сокращению лишних символов в переменной, которая возвращает значение для нашей API-функции.

Проще всего для этого воспользоваться следующующей конструкцией:

strMyString = Left(strMyString, InStr(strMyString, Chr(0)) - 1) 

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

strUserName = Left(strUserName, InStr(strUserName, Chr(0)) - 1)

сразу после строки с вызовом API-функции GetUserName. Теперь, если Вы запустите Вашу программу, то она будет работать корректно.

С этим примером всё.


© Ушку ду Кашку

hidden/visible

Hosted by uCoz