2017-07-20 2 views
0

J'essaie d'importer une DLL dans Python 2.7.12 64 bits en utilisant ctypes. Pour affiner la portée des erreurs, j'ai utilisé l'exemple DLL MathLibrary de Microsoft et construit mon propre basé sur ces instructions (https://msdn.microsoft.com/en-GB/library/ms235636.aspx). Je l'ai construit en tant que version x64 et j'ai copié la DLL résultante dans C: \ root pour éliminer les problèmes de longueur de chemin ou d'erreur d'orthographe. Ma machine nous exécute Windows 7 Pro 64 bits.DLL appelant Python: TypeError: L'objet 'LibraryLoader' n'est pas appelable

Mon code python est:

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

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

add = test_dll.add 

Lorsqu'il est exécuté, il indique ce qui suit:

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 

Quelqu'un peut-il conseiller ce qui pourrait être le problème?

Merci

Andy


Mise à jour:

@eryksun commentaire - éliminaient l'erreur LibraryLoader. Cependant, je me bats maintenant pour accéder à la fonction d'ajout et obtenir cette erreur:

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

En général, il est préférable d'utiliser 'ctypes.WinDLL (" C: \\ MathLibrary.dll ")'. Ou si la bibliothèque utilise 'SetLastError', utilisez' ctypes.WinDLL ("C: \\ MathLibrary.dll", use_last_error = True) '. Si vous insistez pour utiliser 'windll' pour charger la DLL, utilisez' windll.LoadLibrary ("C: \\ MathLibrary.dll") '- une méthode qui appelle' WinDLL' mais ne permet pas de passer des paramètres au constructeur - - ou soit 'windll [" C: \\ MathLibrary.dll "]' ou 'getattr (windll," C: \\ MathLibrary.dll ")', les deux mettent en cache la DLL chargée. – eryksun

Répondre

0

windll est un objet à partir du module ctypes. Il ne peut pas être appelé comme une fonction ('objet n'est pas appelable'). Vous voulez probablement référencer l'une de ses méthodes et l'invoquer.

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

vous pouvez utiliser __dir__() pour voir les objets attributs et méthodes, ou mieux encore, vérifiez la documentation.