如何从Delphi 10.3 Rio中的iOS API函数获取CFStringRef值

问题描述 投票:0回答:1

无法从Delphi 10.3 Rio中的iOS API函数(框架)获得CFStringRef

// 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功能)以MIDI端口的str:CFStringRef名称返回...

如何在Delphi中获取CFString变量的值?在此示例中,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错误。请有人解决方案如何从iOS框架获取ANY CFStringRef值并将其转换为字符串?谢谢。

添加:

我通过FireMonkey frameforks api在Delphi Rio中构建了跨平台(iOS,Android,W64)应用程序-对于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指针const:

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

基于此解决方案https://pjstrnad.com/reading-data-midi-keyboard-ios-probably-also-mac/,[Otherwies编译的应用程序在真实的iOS(iPad)上运行非常好(从连接的MIDI键盘读取MIDI消息)

obj:MIDIObjectRef是来自源的源指针:= MIDIGetSource(ci);

问题正在调用API函数MIDIObjectGetStringProperty。在指针str中:CFStringRef(EndPointName)应该为MIDIportNAME的VALUE。我无法获取此值并解析为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字符串...

无法从Delphi 10.3 Rio中的iOS API函数(框架)获取CFStringRef值//到iOS的外部调用桥函数:函数MIDIObjectGetStringProperty(obj:MIDIObjectRef; ...

ios delphi frameworks firemonkey
1个回答
0
投票

kMIDIPropertyDisplayName在iOS上已损坏,但您可以将其替换为CFSTR('displayName')。这个对我有用。因此,您的函数如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.