如何从 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.CoreFoundation
和 Macapi.Helpers
添加到您的 USES 子句中以访问 CFSTR
和 CFStringRefToStr
无法从 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.CoreFoundation
和 Macapi.Helpers
添加到您的 USES 子句中以访问 CFSTR
和 CFStringRefToStr