我正在尝试运行这个基本功能,但它不起作用:
function GetWindowsUserName: String;
const
MAX_LENGTH = 256;
var
UserNameLength: DWord;
begin
UserNameLength := MAX_LENGTH - 1;
SetLength(Result, MAX_LENGTH);
if GetUserName(PChar(Result), UserNameLength) then
SetLength(Result, UserNameLength - 1)
else
Result := '';
end;
在formCreate上我有:
AdvOfficeStatusBar1.Panels[0].Text := GetWindowsUserName;
我明白了:
[dcc32 Error] Unit1.pas(115): E2034 Too many actual parameters
[dcc32 Error] Unit1.pas(115): E2012 Type of expression must be BOOLEAN
我在这里缺少什么?
编辑:我仍然收到错误:
答案 0 :(得分:1)
报告编译器错误时,必须指出错误适用的代码行。在这种情况下,可以报告该错误的唯一代码行是对GetUserName
的调用。
调用GetUserName
以这种方式失败的唯一方法是在范围内出现意外的GetUserName
。您的代码希望找到GetUserName
中定义的Windows
。显然,不同的版本在范围内。
您可以完全指定符号以使编译器使用正确的符号:
Windows.GetUserName
或者如果您使用名称空间:
Winapi.Windows.GetUserName
答案 1 :(得分:0)
试试这个。
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
- - - - - -
{ Get current username. }
function TForm1.GetCurrentUser(): String;
var
lpUserName: array[0..256] of Char;
nSize: DWord;
begin
// Get current loginname
nSize := SizeOf(lpUserName);
GetUserName(@lpUserName, nSize);
Result := lpUserName;
end;
你必须使用它的这个功能,也许使用导入会给你一些东西,但名字相似。但这是oldskool方法。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724432%28v=vs.85%29.aspx
新方法是SSPI接口。 (废弃这个sspi实际上是针对WinAD验证用户+ pwd值.GetuserName可以正常读取活动的Windows身份)
http://www.michael-puff.de/Programmierung/Delphi/Units/SSPIValidatePassword.pas