2017-08-14 3 views
0

J'utilise ctypes pour appeler un dll pour lire le contenu de la zone de stockage.Mais il renvoie un pointeur char non signé, je veux obtenir le contenu du pointeur.Comment faire Je le fais?Comment obtenir le contenu du pointeur basé sur l'adresse du pointeur

from ctypes import * 

c = WinDLL("FT_ET99_API.dll") 
hwnd = c_void_p() 
c.et_OpenToken(byref(hwnd), c_char_p('53E00FD8'), c_int(1)) 
c.et_Verify(hwnd, c_int(0), c_char_p('35316D69696C616E')) 
f = c.et_Read 
f.argtypes = c_void_p, c_int, c_int, POINTER(c_char_p) 
f.restype = None 
txt = c_char_p() 
f(hwnd, 1, 34, byref(txt)) 
(What should I do next?) 

et_Read( 

ET_HANDLE hHandle(in), 

WORD offset(in), 

int Len(in), 

unsigned char* pucReadBuf(out) 

) 
+0

Déréférencer le pointeur. https://stackoverflow.com/questions/4955198/what-does-dereferencing-a-pointer-mean/4955297#4955297 – quadruplebucky

+0

»Je veux obtenir le contenu du pointeur« Que voulez-vous dire? Voulez-vous récupérer le type et la taille des données stockées ou souhaitez-vous interfacer le tampon brut à python? Le premier n'est pas possible parce que la mémoire ne contient pas d'informations sur son contenu, la seconde est: https://stackoverflow.com/questions/18895081 –

+0

Ce serait un 'char **' s'il était destiné à allouer le tampon pour vous et renvoyez un pointeur dessus. En tant que "char *", je pense qu'il s'attend à ce que vous allouiez le tampon - par ex. 'txt = create_string_buffer (34)', que vous transmettez comme 'f (hwnd, 1, 34, txt)'. La valeur serait soit 'txt.value' (la sous-chaîne terminée par null) soit' txt [:] 'ou' txt.raw' (tous les 34 octets). – eryksun

Répondre

0

J'ai essayé d'une autre manière et elle a réussi.J'obtiens le contenu du tampon brut.

from ctypes import * 

c = WinDLL("FT_ET99_API.dll") 
hwnd = c_void_p() 
c.et_OpenToken(byref(hwnd), c_char_p('53E00FD8'), c_int(1)) 
c.et_Verify(hwnd, c_int(0), c_char_p('35316D69696C616E')) 
outData = create_string_buffer(34) 
c.et_Read(hwnd, 1, 34, outData) 
print outData.value(my aim)