代码之家  ›  专栏  ›  技术社区  ›  Clinton Blackmore

调用一个从PyObjC获取char*的选择器

  •  5
  • Clinton Blackmore  · 技术社区  · 17 年前

    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)在Type中有RecordsOfType:(const char*)

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

    node.hasRecordsOfType_("dsRecTypeStandard:ComputerLists")
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    
    /Users/clinton/<ipython console> in <module>()
    
    ValueError: depythonifying 'char', got 'str' of 31
    

    objc.registerMetaDataForSelector("DSoNode", "hasRecordsOfType_", dict( arguments={ 2+0: dict(type_modifier='n', type='^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

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

    我本来也希望能解释一下输入参数。

    2 回复  |  直到 17 年前
        1
  •  2
  •   nall    17 年前

    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)
                    }
                ))
    

    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()
    
        2
  •  0
  •   Lyndsey Ferguson    16 年前

    from ctypes import *
    
    typeString = c_char_p('dsRecTypeStandard:ComputerLists')
    node.hasRecordsOfType_(typeString)