6

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

7 回答 7

21

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

于 2009-07-20T23:47:59.097 回答
15

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

Result := GetEnvironmentVariable('COMPUTERNAME');

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

于 2009-07-21T00:10:30.957 回答
12

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;
于 2009-07-21T01:26:04.650 回答
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/

于 2011-04-05T15:07:17.657 回答
3

如果您想要的不仅仅是主机名,您还需要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
  • 计算机名NetBIOS、计算机名PhysicalNetBIOS
于 2020-03-19T09:58:20.293 回答
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;

再见

于 2009-07-20T23:48:03.153 回答
0

此代码效果很好,除非计算机在简单的工作组上并尝试使用 GetLocalComputerName(ComputerNameDnsFullyQualified) 返回带有 #0(空)字符的计算机名称,导致其他字符处理错误,作为日志发送到备忘录组件. 只需解决此问题,最后检查 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;
于 2021-01-10T04:05:35.880 回答