gpt4 book ai didi

objective-c - 调用从 PyObjC 获取 char* 的选择器

转载 作者:太空狗 更新时间:2023-10-30 03:54:32 32 4
gpt4 key购买 nike

我正在尝试将私有(private)框架与 PyObjC 一起使用。到目前为止我已经知道了:

from AppKit import *
from Foundation import *
import objc

framework="/System/Library/PrivateFrameworks/DSObjCWrappers.framework"
objc.loadBundle("DSObjCWrapper", globals(), framework)

directory = DSoDirectory.alloc()
directory.initWithHost_user_password_("server", "diradmin", "password")

eDSStartsWith = 0x2002
node = directory.findNode_matchType_(u"/LDAPv3", eDSStartsWith)

这很好用。现在,我想使用此 objective-c 签名在我的节点(DSoNode 类)上调用一个方法。

  • (BOOL) hasRecordsOfType:(const char*) inType

最明显的方法不知道如何获取字符串并将其传递给 char*:

node.hasRecordsOfType_("dsRecTypeStandard:ComputerLists")
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)

/Users/clinton/<ipython console> in <module>()

ValueError: depythonifying 'char', got 'str' of 31

看起来可以像 python 看到的那样更改签名。我尝试了一些变体:

objc.registerMetaDataForSelector("DSoNode", "hasRecordsOfType_", dict( arguments={ 2+0: dict(type_modifier='n', type='^C') }))

但是——坦率地说,我不知道 registerMetaDataForSelector 函数是如何工作的,也没有找到关于它的文档——当我在节点上调用我的选择器时,我仍然遇到同样的错误。我如何告诉 PyObjC 将字符串转换为 char*? (或者是否有更好的方法,因为这些字符串是头文件中#defined 的 C 常量。)


更新:我尝试使用 gen_bridge_metadata(如前所述 in this blog post ),并在查阅手册页后尝试如下:

sudo mkdir -p /System/Library/PrivateFrameworks/DSObjCWrappers.framework/Resources/BridgeSupport
sudo gen_bridge_metadata --framework ~/Downloads/DSTools-112.1/build/Deployment/DSObjCWrappers.framework/ --output /System/Library/PrivateFrameworks/DSObjCWrappers.framework/Resources/BridgeSupport/DSObjCWrappers.bridgesupport

我仍然得到同样的错误;没有迹象表明有人注意到了这一点,除非我输入:

help(modules)

我得到:

/System/Library/PrivateFrameworks/DSObjCWrappers.framework/Versions/A/Resources/<ipython console> in <module>()

NameError: name 'modules' is not defined

我还应该提到,我找到了一个类型列表,我相信 registerMetaDataForSelector 函数可以理解这些类型; objective-C type encodings .请注意,我所追求的特定功能的 XML 表示:

<method selector='hasRecordsOfType:'>
<retval type='B'/>
</method>

我也期待一些解释输入参数的东西。

最佳答案

我相信您需要以下内容,然后应该传递一个非 unicode 字符串:

objc.registerMetaDataForSelector("DSoNode",
"hasRecordsOfType:",
dict(
arguments =
{
2: dict(type=objc._C_PTR + objc._C_CHAR_AS_TEXT,
c_array_delimited_by_null=True,
type_modifier=objc._C_IN)
}
))

一个更完整的 NSString 例子如下:

from AppKit import *
from Foundation import *
import objc

def setupMetadata():
objc.registerMetaDataForSelector("NSString", "stringWithCString:",
dict(
arguments =
{
2: dict(type=objc._C_PTR + objc._C_CHAR_AS_TEXT,
c_array_delimited_by_null=True,
type_modifier=objc._C_IN)
}
))

def doTest():
s = NSMutableString.stringWithString_(u"foo");
NSLog(u"string[" + s + "]")

s2 = NSString.stringWithCString_("bar")
NSLog(u"string[" + s2 + "]")

setupMetadata()
doTest()

关于objective-c - 调用从 PyObjC 获取 char* 的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1268667/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com