Ich wollte so etwas mit Pythons ctypes machen
typedef struct{
int x;
int y;
} point;
point p = {100, 200};
someFunc(&p.y); //Übergeben Sie einen Zeiger auf y
Genau dort, wo ich es normal geschrieben habe
from ctypes import *
class Point(Structure):
_fields_ = [("x", c_int), ("y", c_int)]
p = Point(100, 200)
somedll.someFunc(byref(p.y))
TypeError: byref() argument must be a ctypes instance, not 'int'
Wütend werden
Der mit p.y
erhaltene Wert ist keine ctypes-Instanz, sondern nur eine int-Zahl (in Python), sodass er von byref nicht referenziert werden kann.
mach das
y_offset = Point.y.offset
y_addr = addressof(p) + y_offset
somedll.someFunc(y_addr)
Ich habe den Zeiger oder die Adresse selbst, aber es ist wahrscheinlich das gleiche.
Vielen Dank
Klassenobjekt (einer Unterklasse von Structure) .member name.offset
Scheint in der Lage zu sein, den Versatz dieses Elements vom Anfang der Struktur zu erhalten
Wenn Sie die Adresse am Anfang der Struktur erhalten und den Versatz hinzufügen, können Sie die Adresse des Mitglieds an einem sonnigen Tag abrufen.
Apropos
Klasse object.member name.size
Sie können die Größe dieses Mitglieds mit ermitteln
Wenn Sie es häufig verwenden, ist es besser, es wie folgt zu einer Funktion zu machen.
def get_address_of_member(obj, member_name):
return addressof(obj) + obj.__class__.__dict__[member_name].offset
p = Point(100, 200)
somedll.someFunc(get_address_of_member(p, "y"))
Ich denke nicht, dass es klug ist, aber es ist okay Wenn es einen besseren Weg gibt, würde ich es begrüßen, wenn Sie mich unterrichten könnten.
Recommended Posts