Как получить значение CFStringRef из функции API iOS в Delphi 10.3 Rio - PullRequest
0 голосов
/ 05 апреля 2019

Невозможно получить значение 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 значение?

Я пытаюсь это сделать в своей забаве.: * 10101 *

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

Таким образом, внешний вызов и константы определены в iOSapi.CoreMIDI:

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

и константа указателя iOS:

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 - указатель источника из источника: = MIDIGetSource (ci);

Проблема в вызове API-функции MIDIObjectGetStringProperty.В указателе str: CFStringRef (EndPointName) должно быть VALUE MIDIportNAME.Я не могу получить это значение и выполнить синтаксический анализ строки delphi ...

Я пытался объявить этот poiter 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 ...

...