Abrufen von Zeigern auf Strukturelemente in Python-ctypes

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

Abrufen von Zeigern auf Strukturelemente in Python-ctypes
Wie bekomme ich Stacktrace in Python?
Holen Sie sich Datum in Python
So erhalten Sie die Dateien im Ordner [Python]
Was tun, um eine Google-Tabelle in Python zu erhalten?
Verwenden Sie os.getenv, um Umgebungsvariablen in Python abzurufen
So erhalten Sie den Variablennamen selbst in Python
So ermitteln Sie die Anzahl der Stellen in Python
Holen Sie sich YouTube-Kommentare in Python
So löschen Sie stdout in Python
Holen Sie sich letzten Monat in Python
Melden Sie sich auf der Website in Python an
Super winzige Struktur in Python
Holen Sie sich die Terminalgröße in Python
Holen Sie sich explizit EOF in Python
Sprechen mit Python [Text zu Sprache]
Wie man in Python entwickelt
Holen Sie sich Evernote-Notizen in Python
Post an Slack in Python
Holen Sie sich japanische Synonyme mit Python
Entwickelte eine Bibliothek, um die Kindle-Sammlungsliste in Python abzurufen
Ich habe versucht "Wie man eine Methode in Python dekoriert"
So geben Sie char * in einer Rückruffunktion mit ctypes in Python zurück
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
Drücken Sie in Python auf REST, um Daten von New Relic abzurufen
Ermöglichen Sie die schnelle Ausführung von Python-Skripten in Cloud Run mithilfe des Responders
Rufen Sie github api in Python auf, um Informationen zur Pull-Anforderung zu erhalten
[Python] Wie man PCA mit Python macht
Link, um mit Python zu beginnen
Konvertieren Sie Markdown in Python in PDF
So sammeln Sie Bilder in Python
Verwendung von SQLite in Python
Im Python-Befehl zeigt Python auf Python3.8
Versuchen Sie, Trace in Python zu berechnen
Erste Schritte mit Python
Holen Sie sich ein Kommunikationsmemo in Python
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
6 Möglichkeiten zum Stringen von Objekten in Python
Verwendung von PubChem mit Python
Holen Sie sich den Desktop-Pfad in Python
Holen Sie sich den Hostnamen in Python
Python-Version, um nicht verwendete Ports zu erhalten
Umgang mit Japanisch mit Python
Beginnen Sie mit Python mit Blender
Eine Alternative zu "Pause" in Python
Was tun, wenn in Python minus Null angezeigt wird?
So erhalten Sie eine Zeichenfolge aus einem Befehlszeilenargument in Python
Klicken Sie in Python auf die New Relic-API, um den Status des Servers abzurufen
Holen Sie sich mit Python zusätzliche Daten zu LDAP
Ich habe versucht, PLSA in Python zu implementieren
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Versuchen Sie, sich mit Python bei qiita anzumelden
Erhalten Sie Wechselkurse von offenen Wechselkursen in Python
Installieren Sie Pyaudio, um Wellen in Python zu spielen
Holen Sie sich Suica Balance in Python (mit libpafe)
Ich habe versucht, Permutation in Python zu implementieren