Передача указателя CFStringRef в функцию C в MacRuby - PullRequest
2 голосов
/ 16 ноября 2011

Я хотел вызвать следующую функцию из фреймворка DVDPlayback OS X:

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, «макрос Pointer» сообщил «Ничего не известно о Pointer», ~ 12 просмотров Google и «MacRuby: Полное руководство»)

1 Ответ

1 голос
/ 16 февраля 2012

Несмотря на то, что существует «бесплатный» мост от NSString к CFStringRef, это не относится к NSString * к CFStringRef * из-за использования ARC (автоматического подсчета ссылок).Приведение CFStringRef * к NSString * требует использования __ bridge , поэтому

Pointer.new(:string)

не будет работать.Использование

Pointer.new_with_type('^{__CFString}')

- лучший способ получить этот указатель, а лучший способ найти эту информацию - просмотреть ошибку TypeError, которая генерируется при выборе неправильного типа.Например:

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