2017-07-20 38 views
0

ctypesを使用してDLLをPython 2.7.12 64ビットにインポートしようとしています。エラーの範囲を絞り込むために、私はMicrosoftのMathLibrary DLLの例を使用し、これらの命令(https://msdn.microsoft.com/en-GB/library/ms235636.aspx)に基づいて自分自身を構築しました。私はそれをx64リリースとして構築し、結果のdllをC:\ rootにコピーして、パスの長さやスペルの問題を解消しました。私のマシンは、Windows 7 Pro 64 Bitを実行しています。Python呼び出しDLL:TypeError: 'LibraryLoader'オブジェクトが呼び出せません

私のPythonのコードは次のとおりです。実行すると

from ctypes import cdll, windll, c_long, c_int, create_string_buffer 

test_dll = windll("C:\\MathLibrary.dll") 

add = test_dll.add 

それは次のように報告されます

Traceback (most recent call last): 
    File "C:\temp.py", line 3, in <module> 
    test_dll = windll("C:\\MathLibrary.dll") 
TypeError: 'LibraryLoader' object is not callable 

、誰もが問題になる可能性がありますどのようなアドバイスをすることはできますか?

おかげ

アンディ


更新:

@eryksunコメント - これはLibraryLoaderエラーを取り除きます。しかし、私は現在、add関数にアクセスしてこのエラーに遭遇しています:

add = test_dll.add 
    File "C:\Python27\lib\ctypes\__init__.py", line 375, in __getattr__ 
    func = self.__getitem__(name) 
    File "C:\Python27\lib\ctypes\__init__.py", line 380, in __getitem__ 
    func = self._FuncPtr((name_or_ordinal, self)) 
AttributeError: function 'add' not found 
+1

一般に、 'ctypes.WinDLL(" C:\\ MathLibrary.dll ")'を使う方が良いです。ライブラリが 'SetLastError'を使用している場合は、' ctypes.WinDLL( "C:\\ MathLibrary.dll"、use_last_error = True) 'を使用します。 'windll'を使用してDLLをロードすることを強くお勧めする場合、' windll.LoadLibrary( "C:\\ MathLibrary.dll") ' - WinDLLを呼び出してもコンストラクタに渡すパラメータを許可しないメソッド - または 'windll [" C:\\ MathLibrary.dll "]'または 'getattr(windll、" C:\\ MathLibrary.dll ")'のいずれかで、ロードされたDLLをキャッシュします。 – eryksun

答えて

0

windllはctypesモジュールのオブジェクトです。関数のように呼び出すことはできません( 'オブジェクトは呼び出し可能ではありません')。おそらくそのメソッドの1つを参照して呼び出したいと思うでしょう。あなたがオブジェクトを表示するために__dir__()を使用することができます

test_dll = windll.<func_name>("C:\\MathLibrary.dll") 

の属性とメソッド、またはより良いまだ、documentationを確認してください。

関連する問題