В этом примере мы посмотрим, как можно выяснить имя текущего пользователя 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. Теперь, если Вы запустите Вашу программу, то она будет работать корректно.
С этим примером всё.