在Delphi中获取本地计算机名称的最佳方法是什么?

8
代码需要与D2007和D2009兼容。
我的回答:感谢所有回答的人,我选择了:
function ComputerName : String;
var
  buffer: array[0..255] of char;
  size: dword;
begin
  size := 256;
  if GetComputerName(buffer, size) then
    Result := buffer
  else
    Result := ''
end;

我通常会更简短地编写代码,而不使用单独的缓冲区: SetLength(Result,256); SetLength(Result,GetComputerName(PChar(Result),255)); - Stijn Sanders
1
Stijn,你肯定不会使用那段代码。GetComputerName返回一个Bool,第二个参数不能接受数字字面值。 - Rob Kennedy
4
建议你在设置缓冲区大小时,使用命名常量Max_ComputerName_Length代替魔术数字。 - Rob Kennedy
7个回答

22

Windows API GetComputerName 应该可以解决。它在 windows.pas 中定义。


这是一个过时的API函数,仅限于15个字符。你应该使用GetComputerNameEx代替。 - Jerry Dodge

17

另一种有效的方法是通过环境变量获取计算机名称。这种方法的优点(或缺点,取决于您的软件)是可以轻松地欺骗程序以不同的机器运行。

Result := GetEnvironmentVariable('COMPUTERNAME');
计算机名环境变量是由系统设置的。为了“覆盖”这种行为,您可以创建一个批处理文件,调用您的程序,并在调用之前设置环境变量(每个命令解释器都会获得自己的环境“副本”,并且更改仅限于该会话或从该会话启动的任何子级)。

13

使用 Windows API 中的 GetComputerName 是正确的方法。这是它的一个封装。

function GetLocalComputerName : string;
    var c1    : dword;
    arrCh : array [0..MAX_PATH] of char;
begin
  c1 := MAX_PATH;
  GetComputerName(arrCh, c1);
  if c1 > 0 then
    result := arrCh
  else
    result := '';
end;

4
这是什么意思:

这是什么意思:

function GetComputerName: string;
var
  buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
  Size: Cardinal;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  Windows.GetComputerName(@buffer, Size);
  Result := StrPas(buffer);<br/>
end;

来自http://exampledelphi.com/delphi.php/tips-and-tricks/delphi-how-to-get-computer-name/

这篇文章介绍了如何在Delphi中获取计算机名称,可以使用GetComputerName函数实现。该函数需要传入一个指向字符数组的指针和一个表示字符数组长度的整数。调用该函数后,字符数组将包含计算机名称。

我不确定你是在回答这个旧问题还是在写一个新问题?请阅读常见问题解答,因为这个网站的工作方式与传统论坛不同。 - jachguate

4

如果您需要更多的信息而不只是主机名,则需要使用 GetComputerNameEx。由于有很多错误实现(MAX_COMPUTERNAME_LENGTH 不够用,1024 不好),这里是我的实现:

uses Winapi.Windows;

function GetLocalComputerName(
  NameType: TComputerNameFormat = ComputerNameDnsHostname): string;
var
  len: DWORD;
begin
  len:= 0;
  GetComputerNameEx(NameType, nil, len); //get length
  SetLength(Result, len - 1);
  if not GetComputerNameEx(NameType, PChar(Result), len) then RaiseLastOSError;
end;

NameType参数的有效值包括:

  • ComputerNameDnsHostname,ComputerNameDnsDomain,ComputerNameDnsFullyQualified
  • ComputerNamePhysicalDnsHostname,ComputerNamePhysicalDnsDomain,ComputerNamePhysicalDnsFullyQualified
  • ComputerNameNetBIOS,ComputerNamePhysicalNetBIOS

2

我使用这个,

function GetLocalPCName: String;
var
    Buffer: array [0..63] of AnsiChar;
    i: Integer;
    GInitData: TWSADATA;
begin
    Result := '';
    WSAStartup($101, GInitData);
    GetHostName(Buffer, SizeOf(Buffer));
    Result:=Buffer;
    WSACleanup;
end;

再见


0

这段代码非常好用,除了在计算机处于简单工作组并尝试使用GetLocalComputerName(ComputerNameDnsFullyQualified)时会返回带有#0(null)字符的计算机名称,导致其他字符发送到Memo组件作为日志时处理不良。 只需检查末尾是否为空即可解决此问题。

function GetLocalComputerName(
  NameType: TComputerNameFormat = ComputerNameDnsHostname): WideString;
var
    len: DWORD;

begin

    len:= 0;
    GetComputerNameEx(NameType, nil, len);  //get length
    SetLength(Result, len - 1);
    if not GetComputerNameEx(NameType, PWideChar(Result), len) 
  then RaiseLastOSError;
    // fix null at end
    len := Length(Result);
    if (len > 2) and (Result[len] = #0) then
      Result := Copy(Result, 1, len-1);
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接