-1

Python で既存の dll から dll 関数を呼び出す方法を理解できません。

OTAClient = cdll.LoadLibrary("C:\PATH\OTAClient.dll")
connect = OTAClientDLL.TDConnection()

exceptions.AttributeError: function 'TDConnection' not found                

コンパイラによって名前がマングルされているものを読みました。助言がありますか?

4

2 に答える 2

0

これはおそらく、コンパイラが関数名をマングリングしたためです。この問題を回避するには、次の 2 つの方法があります。

  1. 名前をマングルしないようにコンパイラーに指示するようにコードを修正してください。(外部参照を追加したルックアップ)
  2. マングルされた名前を見つけて、Python から呼び出します (以下の説明を参照してください)。

以下を読んでください(http://docs.python.org/2/library/ctypes.htmlから)

DLL は、"??2@YAPAXI@Z" のように、有効な Python 識別子ではない名前の関数をエクスポートすることがあります。この場合、getattr() を使用して関数を取得する必要があります。

>>>
>>> getattr(cdll.msvcrt, "??2@YAPAXI@Z") 
<_FuncPtr object at 0x...>
>>>

Windows では、一部の dll は関数を名前ではなく序数でエクスポートします。これらの関数は、序数で dll オブジェクトにインデックスを付けることでアクセスできます。

>>>
>>> cdll.kernel32[1] 
<_FuncPtr object at 0x...>
>>> cdll.kernel32[0] 
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "ctypes.py", line 310, in __getitem__
    func = _StdcallFuncPtr(name, self)
AttributeError: function ordinal 0 not found
>>>

関数名がわからない場合は、link.exe dumpbin.exe を調べてください。これらは Visual Studio のインストールで検出され、dll で使用可能なすべての関数をダンプします。結果に対して grep を実行できます。

于 2013-08-01T16:48:00.213 に答える