2017-03-22 3 views
0

J'accède à une DLL à partir de Python en utilisant la bibliothèque ctypes. Les fonctions de la DLL sont accessibles par ordinal plutôt que par nom. Je peux inspecter la DLL en utilisant Dependency Walker et relier les ordinaux aux noms de fonctions. Il y a une variable de numéro d'erreur globale dans la DLL à laquelle je souhaite accéder. Dépendance Walker montre qu'il a une valeur ordinale de 13.Comment puis-je obtenir la valeur d'une variable globale dans une DLL qui est décrite par un ordinal pas un nom en utilisant ctypes en Python?

Il semble qu'il n'y ait aucun moyen d'accéder à une variable globale par un ordinal en utilisant ctypes.

Si la variable globale ont été nommés alors il semble que je serais capable de faire quelque chose comme:

ERROR_VALUE = c_int.in_dll (my_dll_handle, "my_error_value") (https://docs.python.org/3/library/ctypes.html#accessing-values-exported-from-dlls)

Toutes les idées comment j'accède à la variable globale donnée seulement un ordinal?

+0

Je ne l'ai jamais utilisé ce mais il y a une section sur la page que vous avez liée qui semble en discuter. Je viens de chercher ordininal. Voir si cela fonctionne. – FamousJameous

+0

La page liée montre comment utiliser ordinaux pour les fonctions, pas de variables –

Répondre

1

Je n'ai pas vu quelque chose d'explicite dans la documentation, autre que la syntaxe pour fonctions accédé par ordinal. Par l'expérimentation, ce qui suit travaillé:

Code d'essai:

int x = 5; 
int func(int a) { return a*2; } 

fichier .def exportation par ordinal:

EXPORTS 
    x @1 NONAME DATA 
    func @2 NONAME 

code Python:

>>> from ctypes import * 
>>> test = CDLL('test') 
>>> test[2](5)   # Call ordinal 2 function. 
10 
>>> test[1]    # Ordinal 1 thinks it is a function pointer. 
<_FuncPtr object at 0x0000000002FEA048> 
>>> cast(test[1],POINTER(c_int)).contents  # cast? 
c_long(5)          # Worked! 
>>> cast(test[1],POINTER(c_int)).contents.value 
5 
+0

Merci - cela fonctionne! –