2

OS X の DVDPlayback フレームワークから次の関数を呼び出したいと思いました。

OSStatus DVDGetMediaVolumeCFName (
   CFStringRef *outDiscVolumeCFName
);

最終的に、次の作業コードを思いつきました。

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

しかし、私は'^{__CFString}'どのドキュメントにもそのビットを見つけられず、後でそれが実際に何をしているのかを見つけただけでした (最初はエラーメッセージから切り取って貼り付けました)。私は最初に :id と :string の両方で Pointer.new を試しましたが、成功しませんでした。

だから私の質問は:

  • このポインターを取得する最良の方法は何ですか (私の方法は醜いようです)?
  • Pointer.new(:string) が機能しなかったのはなぜですか? String、NSString、およびCFStringは同等だと思いました
  • この情報を見つけるためにどこを見たでしょうか?(MacRuby のサイトをチェックしたところ、「マクロ ポインター」は「ポインターについて何も知られていない」と報告され、Google で 12 件のヒットがあり、「MacRuby: The Definitive Guide」が報告されていました)
4

1 に答える 1

1

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)
于 2012-02-16T01:34:30.553 に答える