В переменной там обычная строка.
Добавлено спустя 4 минуты 7 секунд:Там в конце строки идет символ: #0 , он то все и портит.
если изменить код так, то все работает сразу:
- Код: Выделить всё
procedure TForm1.GetName;
Var
vSizet : DWord;
vPWChart: PWideChar;
vNamePC,
vNameUser : String;
I : DWord;
vWNameUser,
vWNamePC : WideString;
begin
vSizet := 1024;
vPWChart := GetMem(vSizet);
// получаем имя ПК
if GetComputerNameW(vPWChart, vSizet) then
begin
SetString(vWNamePC, vPWChart, vSizet);
vNamePC := UTF8Encode(vWNamePC);
end
else
vNamePC := '';
Memo1.Lines.Add('Имя ПК: '+vNamePC);
// получаем логин !!!
vSizet := 1024;
if GetUserNameW(vPWChart, vSizet) then
begin
// SetString(vWNameUser, vPWChart, vSizet);
// vNameUser := UTF8Encode(vWNameUser);
vNameUser := UTF8Encode(WideString(vPWChart));
end
else
begin
vNameUser := '';
Memo1.Lines.Add('LastError: ' + SysErrorMessageUTF8(GetLastError));
end;
vNameUser := 'GetUserName: '+vNameUser;
Memo1.Lines.Add(vNameUser);
for i:= 0 to 12 do
begin
vSizet := 1024;
if GetUserNameExW(I,vPWChart, vSizet) then
begin
SetString(vWNameUser, vPWChart, vSizet);
vNameUser := UTF8Encode(vWNameUser);
end
else
begin
vNameUser := '';
vNameUser := 'LastError: ' + SysErrorMessageUTF8(GetLastError);
end;
Memo1.Lines.Add('GetUserNameEx '+IntToStr(I)+': '+vNameUser);
end;
FreeMem(vPWChart);
end;
Добавлено спустя 6 минут 43 секунды:Но если оставить преждний код, и на форму добавить кнопку, и вызвать эту процедуру из кнопки, то все отрабатывает нормально, хотя символ #0 есть в злополучной строке...
Добавлено спустя 19 минут 56 секунд:Правильный код:
- Код: Выделить всё
procedure TForm1.GetName;
Var
vSizet : DWord;
vPWChart: PWideChar;
vNamePC,
vNameUser : String;
I : DWord;
vWNameUser,
vWNamePC : WideString;
begin
vSizet := 1024;
vPWChart := GetMem(vSizet);
// получаем имя ПК
if GetComputerNameW(vPWChart, vSizet) then
begin
SetString(vWNamePC, vPWChart, vSizet);
vNamePC := UTF8Encode(vWNamePC);
end
else
vNamePC := '';
Memo1.Lines.Add('Имя ПК: '+vNamePC);
// получаем логин !!!
vSizet := 1024;
if GetUserNameW(vPWChart, vSizet) then
begin
SetString(vWNameUser, vPWChart, vSizet-1);
vNameUser := UTF8Encode(vWNameUser);
end
else
begin
vNameUser := '';
Memo1.Lines.Add('LastError: ' + SysErrorMessageUTF8(GetLastError));
end;
vNameUser := 'GetUserName: '+vNameUser;
Memo1.Lines.Add(vNameUser);
for i:= 0 to 12 do
begin
vSizet := 1024;
if GetUserNameExW(I,vPWChart, vSizet) then
begin
SetString(vWNameUser, vPWChart, vSizet-1);
vNameUser := UTF8Encode(vWNameUser);
end
else
begin
vNameUser := '';
vNameUser := 'LastError: ' + SysErrorMessageUTF8(GetLastError);
end;
Memo1.Lines.Add('GetUserNameEx '+IntToStr(I)+': '+vNameUser);
end;
FreeMem(vPWChart);
end;
Размер использованного буфера возвращаемый системными функциями GetUserNameW и GetUserNameExW больше на 1.
Добавлено спустя 46 секунд:Sharfik - спасибо!