使用正确的参数调用Windows API时编译器错误

时间:2013-10-16 14:19:02

标签: delphi

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

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

我在这里缺少什么?

编辑:我仍然收到错误: enter image description here

2 个答案:

答案 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