Создание Windows-приложений на основе Visual C#

         

Получение имени пользователя. Библиотека secur32.dll


Итак, приступим к практике. Создайте новое Windows-приложение и назовите его GetUserName. Перетаскиваем на форму из окна ToolBox кнопку и надпись. Устанавливаем следующие свойства формы и элементов управления:

Form1, форма, свойствоЗначение
Size560; 96
Text Получение имени пользователя
label1, свойствоЗначение
NamelblGetUserName
Location168; 20
Size368; 23
Text
Button1, свойствоЗначение
NamebtnGetUserName
Location16; 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).

Получение имени пользователя. Библиотека secur32.dll

Рис. 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).

Получение имени пользователя. Библиотека secur32.dll

Рис. 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).


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