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