Передача указателя CFStringRef в функцию C в MacRuby
Я хотел вызвать следующую функцию из среды 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 ответ
Несмотря на то, что существует "бесплатный" мост от 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)