Как получить значение CFStringRef из функции API iOS в Delphi 10.3 Rio

#ios #delphi #frameworks #firemonkey

#iOS #delphi #фреймворки #firemonkey

Вопрос:

Не удается получить CFStringRef значение из функции API iOS (framework) в Delphi 10.3 Rio

 // external call bridge function to iOS:
function MIDIObjectGetStringProperty(obj: MIDIObjectRef;
            propertyID: CFStringRef;
            out str: CFStringRef):OSStatus; cdecl; external libCoreMidi name _PU   'MIDIObjectGetStringProperty'; 
  

Функция MIDIObjectGetStringProperty (функция iOS CoreMIDI) возвращает str:CFStringRef название MIDI-портов…

Как я могу получить значение CFString переменной в Delphi? В этом примере str:CFStringRef значение?

Я пробую это в своей функции.:

 function getDisplayName(obj: MIDIEndpointRef):string;
var 
    EndPointName: CFStringRef;
    i:integer;
begin
    //EndPointName:= nil; // when I assign nil value, function return i=-50 otherwise raise Access Violation error ...

    i := MIDIObjectGetStringProperty(obj, kMIDIPropertyDisplayName , EndPointName); --> AV error !!!

    //in EndPointName should be returned CFStringRef value from iOS 

    getDisplayName :=  CFToDelphiString(EndPointName); // convert to string
end;
  

Вероятно, EndPointName необходимо выделить… иначе я выдаю ошибку AV. Пожалуйста, есть у кого-нибудь решение, как получить КАКОЕ-либо CFStringRef значение из платформы iOS и преобразовать в строку? Спасибо.

Добавляет:

Я создаю кроссплатформенное приложение (iOS, Android, W64) в Delphi Rio через FireMonkey frameforks api — для CoreMIDI я использую этот интерфейсhttps://github.com/FMXExpress/ios-object-pascal-wrapper/blob/master/iOSapi.CoreMIDI.pas

Итак, вызов externall и константы определены в iOSapi.CoreMIDI там:

 function MIDIObjectGetStringProperty (obj: MIDIObjectRef; propertyID: CFStringRef; str: CFStringRef) : OSStatus; cdecl; external libCoreMIDI name _PU   'MIDIObjectGetStringProperty';
  

и указатель iOS const:

 function kMIDIPropertyDisplayName: Pointer;
begin
  Result := CocoaPointerConst(libCoreMIDI, 'kMIDIPropertyDisplayName');
end;
  

Другое скомпилированное приложение работает на реальной iOS (iPad) очень хорошо (считывает MIDI-сообщение с подключенной MIDI-клавиатуры) на основе этого решенияhttps://pjstrnad.com/reading-data-midi-keyboard-ios-probably-also-mac /

obj: MIDIObjectRef — это указатель на источник из source:= MIDIGetSource (ci);

Проблема заключается в вызове функции API MIDIObjectGetStringProperty. В указателе str: CFStringRef (EndPointName) должно быть ЗНАЧЕНИЕ MIDIportNAME. Я не могу получить это значение и выполнить синтаксический анализ в delphi string…

Я попытался объявить этот более простой CFStringRef как:

 var
EndPointName: pointer;
EndPointName1: array of Byte;
EndPointName2: TBytes;
EndPointName3: TPtrWrapper;
M: TMarshaller;
  

и построение как:

 SetLength(EndPointName1, 255);
GetMem(EndPointName2,255);
EndPointName3 := M.AllocMem(255);

i := MIDIObjectGetStringProperty(obj, kMIDIPropertyDisplayName , @EndPointNameX);
  

—> ничего не работает, ошибка AV!!!

Я думаю, что это должно быть решение, как получить CFStringRef и преобразовать в строку delphi…

Комментарии:

1. Как получены obj и kMIDIPropertyDisplayName? Важно показать весь код, который мы не можем определить сами.

2. XE не поддерживает iOS

3. Спасибо за реакцию. Я добавляю больше информации.

4. Пожалуйста, перестаньте ссылаться на XE. Эта версия Delphi предшествовала поддержке мобильных устройств. Вы используете 10.3 Rio. Пожалуйста, исправьте текст.

5. О, Извините, исправлено…

Ответ №1:

kMIDIPropertyDisplayName В iOS не работает, но вы можете заменить его на CFSTR(‘DisplayName’). У меня это работает. Итак, ваша функция выглядит следующим образом:

 function getDisplayName(aEndPointRef: MIDIEndpointRef):string;
var 
  LEndPointName: CFStringRef;
  i:integer;
begin
  getDisplayName := 'MIDI endpoint';
  LEndPointName:= nil; 
  i := MIDIObjectGetStringProperty(aEndPointRef, CFSTR('displayName'), LEndPointName);
  if (i=0) and (LEndPointName<>nil) then
    getDisplayName := CFStringRefToStr(LEndPointName);
end;
  

Добавьте Macapi.CoreFoundation и Macapi.Helpers в ваше предложение USES, чтобы получить доступ к CFSTR и CFStringRefToStr