声明枚举类型
type EXTENDED_NAME_FORMAT=(NameUnknown,NameFullyQualifiedDN,NameSamCompatible,NameDisplay);
声明API方法function GetUserNameEx(NameFormat:EXTENDED_NAME_FORMAT;lpNameBuffer:String; var lpnSize:integer) : integer;
external 'GetUserNameExA@secur32.dll stdcall';
实现方法external 'GetUserNameExA@secur32.dll stdcall';
function GetUserName():string;
var
Ret:integer;
begin
lpNameBuffer:='0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
lpNameBuffer:=lpNameBuffer+lpNameBuffer;
ret:=Length(lpNameBuffer);
NameFormat:= NameSamCompatible;
If GetUserNameEx(NameFormat, lpNameBuffer, Ret)<>0 Then
begin
if lpNameBuffer[Ret]=#0 then
begin
Ret:=Ret-1;
end
result:=Copy(lpNameBuffer,1,Ret);
end
else
begin
result:='-1';
end
end;
这个实现方法中主要有两个小问题:var
Ret:integer;
begin
lpNameBuffer:='0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
lpNameBuffer:=lpNameBuffer+lpNameBuffer;
ret:=Length(lpNameBuffer);
NameFormat:= NameSamCompatible;
If GetUserNameEx(NameFormat, lpNameBuffer, Ret)<>0 Then
begin
if lpNameBuffer[Ret]=#0 then
begin
Ret:=Ret-1;
end
result:=Copy(lpNameBuffer,1,Ret);
end
else
begin
result:='-1';
end
end;
首先要初始化一个足够长度的string,否则GetUserNameEx无法写入;
其次是在winxp系统下返回的用户名会比其他系统下多一个“\0”字符。
2.WinXP系统下利用OLEDB连接本地SQLServer2005需要使用计算机名,而使用(local)或localhost都无法连接。利用ado.net没有这个问题,连接SQLServer Express也没有这个问题。
3.Vista系统下将可执行文件改名为setup.exe将会自动以管理员的身份运行。