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

How to obtain CFStringRef value from iOS API function in Delphi 10.3 Rio

无法从 iOS API 函数(框架)中获取 CFStringRef 值 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 函数)return in str:CFStringRef MIDI 端口名称 ...

如何在Delphi中获取CFString变量的值?在这个例子中 str:CFStringRef value?

我在我的函数中试了一下:

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 框架获取任何 CFStringRef 值并转换为字符串?谢谢

添加:

我通过 FireMonkey frameforks Delphi 在 Delphi Rio 中构建跨平台(iOS、Android、W64)应用程序 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;

基于此解决方案 https://pjstrnad.com/reading-data-midi-keyboard-ios-probably-also-mac/

,其他编译的应用程序在真实 iOS (iPad) 上工作得很好(从连接的 MIDI 键盘读取 MIDI 消息)

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

问题是调用 API 函数 MIDIObjectGetStringProperty。在指针 str 中:CFStringRef (EndPointName) 应该是 MIDIportNAME 的 VALUE。我无法获取此值并解析为 delphi 字符串 ...

我尝试将此指针 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 字符串 ...

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.CoreFoundationMacapi.Helpers 添加到您的 USES 子句中以访问 CFSTRCFStringRefToStr