Передача указателя CFStringRef на функцию C в MacRuby

Я хотел вызвать следующую функцию из среды 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: Полное руководство»)

person Sean DeNigris    schedule 16.11.2011    source источник


Ответы (1)


Хотя существует «бесплатный» мост от 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)
person jtomschroeder    schedule 16.02.2012