cocoa - 将 CFStringRef 指针传递给 MacRuby 中的 C 函数

标签 cocoa macruby cfstring

我想从 OS X 的 DVDPlayback 框架调用以下函数:

OSStatus DVDGetMediaVolumeCFName (
   CFStringRef *outDiscVolumeCFName
);

最终,我想出了以下工作代码:

framework 'DVDPlayback'
p2 = Pointer.new_with_type('^{__CFString}')
DVDGetMediaVolumeCFName(p2)

但我在任何文档中都没有找到 '^{__CFString}' 位,后来才发现它真正在做什么(我最初是从错误消息中剪切并粘贴它的)。我首先尝试使用 Pointer.new 和 :id 和 :string 但没有成功。

所以我的问题是:

  • 获取此指针的最佳方法是什么(我的方法看起来很难看)?
  • 为什么 Pointer.new(:string) 不起作用?我认为 String、NSString 和 CFString 是等效的
  • 我应该在哪里找到这些信息? (我检查了 MacRuby 网站,“macro Pointer”报告“对 Pointer 一无所知”,约 12 次 Google 搜索,以及“MacRuby:权威指南”)

最佳答案

尽管存在从 NSString 到 CFStringRef 的“免费”桥梁,但由于使用了 ARC(自动引用计数),因此这不适用于 NSString* 到 CFStringRef*。将 CFStringRef* 转换为 NSString* 需要使用 __bridge,因此

Pointer.new(:string)

不会工作。使用

Pointer.new_with_type('^{__CFString}')

是获取此指针的最佳方法,而查找此信息的最佳方法是查看选择错误类型时生成的 TypeError。例如:

expected instance of Pointer of type `^{__CFString}', got `*' (TypeError)

关于cocoa - 将 CFStringRef 指针传递给 MacRuby 中的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8146629/

相关文章:

macos - OSX 本地化 - 我做错了什么?

cocoa - 如何在 NSSavePanel 中预设文件名?

macos - RubyMotion 中的指针与 MacRuby 中的指针

ios - 如何根据 objective-c 中的内存地址知道对象名称

macos - 防止网络设置询问密码

objective-c - 何时使用 [NSCalendar autoupdatingCurrentCalendar] 的示例

cocoa - 如何在 MacRuby 中执行命令、向其标准输入提供数据并从其标准输出读取数据?

swift - 如何在swift中正确使用CFStringGetCString?

objective-c - 诊断错误 : "release sent to deallocated object"

Cocoa Dock 触发 NSApplicationDidChangeScreenParametersNotification