如何在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平台调用步骤
- 引入依赖单元:Delphi环境引入
Macapi.CoreFoundation、Posix.Pthread单元;C++Builder环境引入对应CoreFoundation和pthread头文件。 - 实现线程安全的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;
- 调用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
相关产品推荐
相关产品推荐

