这应该可以在“信不信由你”的问题下发布,但是......只要我在表单上放置dxComponentPrinter1(devexpress),我的函数就会停止工作:
Function GetUserFromWindows: string;
Var
UserName : string;
UserNameLen : Dword;
Begin
UserNameLen := 100;
SetLength(userName, UserNameLen) ;
If GetUserName(PChar(UserName), UserNameLen) Then
Result := Copy(UserName,1,UserNameLen - 1)
Else
Result := 'Unknown';
end;
当我删除它(dxComponentPrinter1)时,它可以正常工作。当dxComponentPrinter1在表单上时,我得到的错误是:
[dcc32错误] Unit3.pas(101):E2034实际参数太多[dcc32 错误] Unit3.pas(101):E2012表达式必须是BOOLEAN
Delphi XE6以红线突出显示:
GetUserName(PChar(UserName),UserNameLen)
如果我删除该功能,那么一切都编译好了。没错。 以前有人遇到过这个吗?
答案 0 :(得分:4)
将组件添加到表单时,devExpress单元将添加到uses子句中。此单元定义了您的代码现在看到的名为GetUserName
的函数,而不是您要在Windows
单元中声明的函数。
您可以通过完全限定对GetUserName
的调用来处理此问题。任
Windows.GetUserName
或
Winapi.Windows.GetUserName
取决于您在使用它时命名Windows
单位的方式。
就个人而言,我希望看到这个GetUserFromWindows
函数在低级单元而不是GUI单元中声明。
如果你想创建一个读取用户名并可以处理任意长度名称的函数,那么你可以选择这个可能过度工程的版本:
function UserName: string;
var
Len: DWORD;
begin
Len := 0;
Win32Check(not GetUserName(nil, Len) and (GetLastError=ERROR_INSUFFICIENT_BUFFER));
SetLength(Result, Len-1);
Win32Check(GetUserName(PChar(Result), Len));
end;
请注意,我在这里没有完全限定,因为我假设您将此函数移动到不使用dexExpress UI组件的其他单元。