【问题标题】:What's the best method for getting the local computer name in Delphi在Delphi中获取本地计算机名称的最佳方法是什么
【发布时间】:2009-07-20 23:34:54
【问题描述】:

代码需要兼容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,您肯定不会使用该代码。 GetComputerName 返回 Bool 并且不接受数字文字作为其第二个参数。
  • Alister,我建议您使用命名常量 Max_ComputerName_Length 代替幻数作为缓冲区大小。

标签: delphi computer-name


【解决方案1】:

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

【讨论】:

  • 这是一个过时的 API 函数,仅限于 15 个字符。您应该改用 GetComputerNameEx。
【解决方案2】:

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

Result := GetEnvironmentVariable('COMPUTERNAME');

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

【讨论】:

    【解决方案3】:

    从 Windows API 获取计算机名称是可行的方法。这是它的包装器。

    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/

      【讨论】:

      • 我不确定你是想回答这个老问题还是想写一个新问题?阅读faq,因为该网站的运作方式与传统论坛不同。
      【解决方案5】:

      如果您想要的不仅仅是主机名,您还需要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

      【讨论】:

        【解决方案6】:

        我用这个,

        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;
        

        再见

        【讨论】:

          【解决方案7】:

          此代码运行良好,除非计算机位于简单工作组并尝试使用 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;
          

          【讨论】:

            猜你喜欢
            • 2011-01-25
            • 2010-09-13
            • 2022-11-02
            • 1970-01-01
            • 2011-06-14
            • 1970-01-01
            • 2010-09-13
            • 2012-07-25
            • 1970-01-01
            相关资源
            最近更新 更多