Получение имени пользователя. Библиотека secur32.dll
Итак, приступим к практике. Создайте новое Windows-приложение и назовите его GetUserName. Перетаскиваем на форму из окна ToolBox кнопку и надпись. Устанавливаем следующие свойства формы и элементов управления:
Size | 560; 96 |
Text | Получение имени пользователя |
Name | lblGetUserName |
Location | 168; 20 |
Size | 368; 23 |
Text |
Name | btnGetUserName |
Location | 16; 20 |
Text | Получить! |
В окне Solution Explorer щелкаем правой кнопкой на названии проекта и выбираем Add\Add New Item…. В появившемся окне шаблонов выбираем класс и называем его WinAPIClass.cs. Переходим в его код и добавляем пространство имен для работы с библиотеками dll и объектом StringBuilder:
using System; using System.Runtime.InteropServices; using System.Text;
Обращаемся к библиотеке secur32.dll и создаем метод GetUserNameEx (привожу пространство имен класса полностью 11)):
Листинг 5.1.
(html, txt)
Все! Класс, использующий функцию WinAPI, готов. В обработчике кнопки btnGetUserName обращаемся к созданному классу:
private void btnGetUserName_Click(object sender, System.EventArgs e) { StringBuilder builder = new StringBuilder(100); uint size = 100; WinAPIClass.GetUserNameEx((int)WinAPIClass.NameFormat.NameSamCompatible, builder, ref size); lblGetUserName.Text = String.Format("Имя пользователя: {0}", builder.ToString()); }
Обратите внимание на то, что в качестве значения перечисления идет тип данных int, объект StringBuilder передается в качестве строки и к последнему параметру добавляется ключевое слово ref, т.к. параметр передается по ссылке. Результатом запуска приложения будет определение имени текущего пользователя (рис. 5.1).
Рис. 5.1. Результат запуска приложения GetUserName
Класс WinAPIClass, в котором происходит обращение к библиотеке secur32.dll, мог быть написан на другом, C-подобном языке, в оригинале он был реализован именно на C. Интересно сравнить типы данных двух листингов объявления методов:
- Метод GetUserNameEx на языке С
BOOLEAN GetUserNameEx( EXTENDED_NAME_FORMAT // формат имени NameFormat, // буфер для названия LPTSTR lpNameBuffer, // размер буфера для названия PULONG nSize );
- Метод GetUserNameEx на языке С#
[DllImport("secur32.dll", CharSet=CharSet.Auto)] public static extern int GetUserNameEx (int nameFormat, StringBuilder userName, ref uint userNameSize);
Выбор типа данных может повлиять на выполнение преобразования входящих и исходящих параметров. Например, в библиотеках WinAPI тип данных long — 32-битный, в то время как в C# тип данных long — 64-битный.
На диске, прилагаемом к книге, вы найдете приложение GetUserName (Code\Glava5\GetUserName).
private void btnGetUserName_Click(object sender, System.EventArgs e) { StringBuilder builder = new StringBuilder(100); uint size = 100; WinAPIClass.GetUserNameEx((int)WinAPIClass.NameFormat.NameSamCompatible, builder, ref size); lblGetUserName.Text = String.Format("Имя пользователя: {0}", builder.ToString()); }
Обратите внимание на то, что в качестве значения перечисления идет тип данных int, объект StringBuilder передается в качестве строки и к последнему параметру добавляется ключевое слово ref, т.к. параметр передается по ссылке. Результатом запуска приложения будет определение имени текущего пользователя (рис. 5.1).
Рис. 5.1. Результат запуска приложения GetUserName
Класс WinAPIClass, в котором происходит обращение к библиотеке secur32.dll, мог быть написан на другом, C-подобном языке, в оригинале он был реализован именно на C. Интересно сравнить типы данных двух листингов объявления методов:
- Метод GetUserNameEx на языке С
BOOLEAN GetUserNameEx( EXTENDED_NAME_FORMAT // формат имени NameFormat, // буфер для названия LPTSTR lpNameBuffer, // размер буфера для названия PULONG nSize ); - Метод GetUserNameEx на языке С#
[DllImport("secur32.dll", CharSet=CharSet.Auto)] public static extern int GetUserNameEx (int nameFormat, StringBuilder userName, ref uint userNameSize);
Выбор типа данных может повлиять на выполнение преобразования входящих и исходящих параметров. Например, в библиотеках WinAPI тип данных long — 32-битный, в то время как в C# тип данных long — 64-битный.
На диске, прилагаемом к книге, вы найдете приложение GetUserName (Code\Glava5\GetUserName).