私はPyObjCでプライベートフレームワークを使用しようとしています。私はこれまでこれを持っています:PyObjCからchar *を受け取るセレクタを呼び出す
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)
それはうまくいきます。さて、私はこの目的のC署名を使って(クラスDSoNodeの)自分のノード上のメソッドを呼びたいと思います。
- (BOOL)hasRecordsOfType:
:最も明白な方法は、文字列を取る方法を知っているとのchar *に渡していないnode.hasRecordsOfType_("dsRecTypeStandard:ComputerLists") --------------------------------------------------------------------------- ValueError Traceback (most recent call last) /Users/clinton/<ipython console> in <module>() ValueError: depythonifying 'char', got 'str' of 31
(のconst char型*)INTYPE
pythonが見ているように署名を変更することができるようです。私は上のいくつかのバリエーションを試してみました:
objc.registerMetaDataForSelector("DSoNode", "hasRecordsOfType_", dict(arguments={ 2+0: dict(type_modifier='n', type='^C') }))
しかし - と率直に言って、私はregisterMetaDataForSelector機能がどのように動作するか分からない、その上にドキュメントを発見していない - 私は私のセレクタを起動するとき、私はまだ同じエラーを取得しますノード上でPyObjCに文字列をchar *に変換するように指示するにはどうすればよいですか?男と協議した後、私は(in this blog postを述べたように)gen_bridge_metadata
を使用してみました、そして:
更新(。または、これらの文字列は、ヘッダファイルで、#defineで定義Cの定数であるとして、それを行うには良い方法は、あります)次のように試してみました。
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>
私は入力パラメータについても説明しています。私はあなたが次のことをしたいと、非ユニコード文字列を渡す必要があると考えてい
c_char_pを使用してCの文字列(私の答えを参照) –