Создание 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).


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


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