Чтение имени пользователя для входа в Windows с помощью Ada 95

Есть ли в Ada 95 функция, которая возвращает мне строку, содержащую зарегистрированное имя пользователя в приложении Windows? Спасибо.


ada
person Rego    schedule 08.11.2011    source источник
comment
Язык (например, C++) не имеет понятия в своем стандарте для пользователей или логинов. Таким образом, вы можете немного перефразировать этот вопрос, чтобы избежать множества педантичных ответов, которые не являются базовыми функциональными ответами Ады. Возможно, что-то вроде: «Как я могу получить имя вошедшего в систему пользователя Windows из моей программы на Аде?» Я использую компилятор XYZ.   -  person T.E.D.    schedule 09.11.2011


Ответы (4)


Общий ответ заключается в использовании любого механизма, поддерживаемого вашей средой Ada, для вызова собственных функций Win32 API и для вызова GetUserName.

person Greg Hewgill    schedule 08.11.2011

Конкретный пакет GNAT Ada.Command_Line.Environment может быть доступной альтернативой.

person trashgod    schedule 09.11.2011

Если бы вам было разрешено использовать Ada 2005, вы могли бы использовать пакет Ada.Environment_Variables, чтобы получить значение USERNAME (я думаю, это правильная переменная окружения для Windows? Это USER в Дарвине...)

person Simon Wright    schedule 09.11.2011
comment
Или вы можете использовать pragma Import(C, getenv); - person Keith Thompson; 09.11.2011
comment
Проблема с использованием переменной среды заключается в том, что ее легко подделать. (Так же, как и GetUserName, но менее тривиально.) - person Greg Hewgill; 10.11.2011

Используя идею из комментария @KeithThompson, а также предложение @SimonWright USERNAME, один из способов сделать это — использовать код:

function GetUsername return String is
   function GetEnv (Variable : String) return Interfaces.C.Strings.chars_ptr;
   pragma Import (C, GetEnv, "getenv");

   Command : constant String := "USERNAME";
   Answer_Ptr : constant Interfaces.C.Strings.chars_ptr := GetEnv (Command);
   Answer : constant String := Interfaces.C.Strings.Value (Answer_Ptr);
begin
   return Answer;
end GetUsername;

Не чистая Ада 95, но она хорошо подходит (и мне не нужно использовать переключатель gnat05).

person Rego    schedule 09.11.2011