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

如何在Firemonkey应用中访问第三方Mac硬件厂商SDK的API

FireMonkey调用跨平台硬件SDK入门指引

关于bundle内无后缀Unix可执行文件的说明

你提到的该文件本质就是符合Mach-O格式的动态库文件,和dylib格式核心一致,区别是它被封装在CFBundlePackageType为BNDL的bundle包中,不支持直接编译期链接,必须通过CoreFoundation提供的CFBundle系列接口运行时加载、获取导出函数指针才能调用,和你提供的XCode示例逻辑完全匹配。

通用前置准备

  • 首先从SDK提供的C/C头文件中,提取所有接口声明、枚举、函数指针定义,转换成你使用的FireMonkey开发语言(Delphi/CBuilder)兼容的声明,注意:
    • COM接口的方法顺序、调用约定必须和原头文件完全对齐
    • 跨平台类型要做好映射:比如HRESULT、CFStringRef、指针类型的对应关系要准确

Mac平台调用步骤

  1. 引入依赖单元:Delphi环境引入Macapi.CoreFoundation、Posix.Pthread单元;C++Builder环境引入对应CoreFoundation和pthread头文件。
  2. 实现线程安全的SDK初始化逻辑,对应你提供的XCode示例,Delphi参考实现如下:
type
  TCreateDiscoveryFunc = function: IDiscovery; cdecl;

var
  gOnceControl: pthread_once_t = PTHREAD_ONCE_INIT;
  gCreateDiscoveryFunc: TCreateDiscoveryFunc = nil;
  gBundleRef: CFBundleRef;

procedure InitAPI; cdecl;
var
  bundleURL: CFURLRef;
  bundlePath: CFStringRef;
  funcName: CFStringRef;
begin
  bundlePath := CFStringCreateWithCString(nil, '/Library/你的SDK.bundle的实际路径', kCFStringEncodingUTF8);
  bundleURL := CFURLCreateWithFileSystemPath(kCFAllocatorDefault, bundlePath, kCFURLPOSIXPathStyle, True);
  if Assigned(bundleURL) then
  begin
    gBundleRef := CFBundleCreate(kCFAllocatorDefault, bundleURL);
    if Assigned(gBundleRef) then
    begin
      funcName := CFStringCreateWithCString(nil, 'GetDiscoveryInstance', kCFStringEncodingUTF8);
      gCreateDiscoveryFunc := TCreateDiscoveryFunc(CFBundleGetFunctionPointerForName(gBundleRef, funcName));
      CFRelease(funcName);
    end;
    CFRelease(bundleURL);
  end;
  CFRelease(bundlePath);
end;

function CreateDiscoveryInstance: IDiscovery;
begin
  pthread_once(@gOnceControl, @InitAPI);
  if Assigned(gCreateDiscoveryFunc) then
    Result := gCreateDiscoveryFunc()
  else
    Result := nil;
end;
  1. 调用SDK接口:在应用启动逻辑中调用CreateDiscoveryInstance获取IDiscovery实例,再调用ConnectTo方法获取mDevice对象即可,注意Delphi字符串转CFStringRef后需要手动调用CFRelease释放,避免内存泄漏。

Windows平台调用步骤

因为SDK是标准COM DLL,有两种成熟调用方案:

  • 方案1:导入类型库生成调用单元,在IDE中选择「导入类型库」,选中对应的COM DLL,IDE会自动生成兼容的接口声明单元,直接创建COM对象实例即可调用。
  • 方案2:手动加载DLL调用,通过LoadLibrary加载DLL,获取DllGetClassObject导出函数,按照标准COM规范创建接口实例即可,逻辑和普通Win32 COM调用完全一致。

跨平台适配注意事项

  • 使用条件编译指令分隔不同平台的逻辑,Delphi用{$IFDEF MSWINDOWS}/{$IFDEF MACOS},C++Builder用#ifdef _WIN32/#ifdef __APPLE__
  • 所有CoreFoundation框架创建的对象(CFStringRef、CFURLRef、CFBundleRef等)使用完毕后必须调用CFRelease释放
  • 确认Mac下bundle的路径配置正确,需要和SDK安装后的实际路径完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:54:02