#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