You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Delphi在macOS系统中获取计算机名称?

Delphi在macOS平台获取计算机名实现方案

方案选型说明

你之前Windows端的逻辑调用的是Win32专属接口,macOS平台无对应实现,根据使用场景二选一即可:

  • 需要做网络寻址、服务注册等技术场景,用Posix标准接口,全平台兼容
  • 需要在UI上给用户展示和系统「关于本机」完全一致的友好名称,用macOS原生Cocoa接口

方案1:Posix标准接口(全平台兼容)

该接口基于POSIX标准实现,Windows(基于Winsock)、macOS、Linux均支持,返回网络主机名,部分场景会带.local后缀。

引用单元

  • 公共单元:System.SysUtils
  • POSIX平台(macOS/Linux):Posix.Unistd, Posix.SysSocket
  • Windows平台:Winapi.Winsock2

实现代码

function GetNetworkHostName: string;
var
  Buffer: array[0..255] of AnsiChar;
begin
  FillChar(Buffer, SizeOf(Buffer), 0);
  if gethostname(Buffer, SizeOf(Buffer)) = 0 then
    Result := string(UTF8String(Buffer))
  else
    Result := string.Empty;
end;

方案2:macOS原生接口(获取用户可见友好名称)

直接调用Cocoa框架的NSHost接口,返回的名称和系统设置-通用-关于本机中显示的名称完全一致,适合UI展示场景。

引用单元

Macapi.Foundation, Macapi.Helpers, Macapi.ObjectiveC

实现代码

{$IFDEF MACOS}
function GetMacOSLocalComputerName: string;
var
  CurrentHost: NSHost;
begin
  CurrentHost := TNSHost.Wrap(TNSHost.OCClass.currentHost);
  if not Assigned(CurrentHost) then Exit(string.Empty);
  Result := NSStrToStr(CurrentHost.localizedName);
end;
{$ENDIF}

注意:如果调用CurrentHost.name属性,拿到的是带.local后缀的网络主机名,只有localizedName返回用户在系统设置中自定义的展示名称。


跨平台调用示例

结合你已经调试完成的Windows端逻辑,加条件编译即可实现全平台适配:

function GetDeviceShowName: string;
begin
{$IFDEF MSWINDOWS}
  // 替换为你已验证的Windows端获取逻辑
  Result := GetWindowsComputerName;
{$ENDIF}
{$IFDEF MACOS}
  Result := GetMacOSLocalComputerName;
{$ENDIF}
end;

常见踩坑

  • 不要在macOS编译目标下直接调用Winapi.Windows单元下的GetComputerName,该函数无macOS实现,会引发编译或运行错误
  • 字符串转换必须用Delphi自带的NSStrToStr方法,不要手动做编码转换,避免Unicode乱码
  • 该原生接口需要Delphi XE2及以上版本支持(XE2是首个正式支持macOS FireMonkey开发的Delphi版本),过低版本无内置Cocoa桥接单元

内容的提问来源于stack exchange,提问作者Bradley Rice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:36:21