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

时间:2009-07-20 23:34:55

标签: delphi computer-name

代码需要与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;

7 个答案:

答案 0 :(得分:17)

Windows API GetComputerName应该有效。它在windows.pas中定义。

答案 1 :(得分:10)

另一种效果很好的方法是通过环境变量获取计算机名称。这种方法的优点(或者取决于您的软件的缺点)是您可以轻松地将程序作为一台不同的机器运行。

Result := GetEnvironmentVariable('COMPUTERNAME');

计算机名称环境变量由系统设置。要“覆盖”该行为,您可以创建一个调用程序的批处理文件,在调用之前设置环境变量(每个命令解释器获取其自己的环境“副本”,并且更改是该会话或任何子项的本地更改从该会议开始)。

答案 2 :(得分:8)

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;

答案 3 :(得分:3)

这个怎么样:

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/

答案 4 :(得分: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;

再见

答案 5 :(得分:1)

如果您不仅需要主机名,还需要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
  • ComputerNamePhysicalDns主机名,ComputerNamePhysicalDnsDomain,ComputerNamePhysicalDnsFullyQualified
  • ComputerNameNetBIOS,ComputerNamePhysicalNetBIOS

答案 6 :(得分:0)

此代码效果很好,除非计算机位于简单的工作组中并尝试使用 GetLocalComputerName(ComputerNameDnsFullyQualified) 返回计算机名称并以 #0(空)字符结尾,从而导致对发送到 Memo 组件的其他字符的错误处理作为日志。 只需解决此问题,最后检查 null。

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;