0

我正在尝试运行这个基本功能,但它不起作用:

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

我在这里想念什么?

编辑:我仍然收到错误: 在此处输入图像描述

4

2 回答 2

1

当您报告编译器错误时,您必须指出错误适用于代码的哪一行。在这种情况下,唯一可以报告该错误的代码行是对GetUserName.

以这种方式调用GetUserName失败的唯一方法是在范围内出现意外GetUserName。您的代码期望GetUserNameWindows. 显然,不同的版本在范围内。

您可以完全指定符号以使编译器使用正确的符号:

Windows.GetUserName

或者如果您使用命名空间:

Winapi.Windows.GetUserName
于 2013-10-16T14:21:19.223 回答
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

于 2013-10-16T14:21:41.960 回答