GetUserName 可取得目前執行緒安全性內容的使用者名稱。關鍵在於緩衝區大小的處理:先呼叫一次取得所需大小,再配置記憶體,最後正式取值。本文提供三種寫法:固定陣列、GetMem/FreeMem、StrAlloc/StrDispose。
function GetUserName(lpBuffer: PChar; var nSize: DWORD): BOOL; stdcall;
var
arr: array[0..254] of Char;
d: DWORD;
begin
d := SizeOf(arr);
GetUserName(arr, d);
ShowMessage(arr); // 例如 'wy'
end;
var
p: PChar;
num: DWORD;
begin
num := 0;
GetUserName(nil, num); // 取得所需大小
ShowMessage(IntToStr(num));
GetMem(p, num);
GetUserName(p, num);
ShowMessage(p); // 'wy'
FreeMem(p);
end;
var
p: PChar;
num: DWORD;
begin
num := 0;
GetUserName(nil, num);
p := StrAlloc(num);
if GetUserName(p, num) then
ShowMessage(p) // 'wy'
else
ShowMessage('無');
StrDispose(p);
end;
建議採用寫法一,除非極度在意堆疊空間。注意:Windows 2000 以上最大使用者名稱長度為 256 字元 (含終止符)。