Mittels ctypes und Structure aus Shared Memory Bereich lesen
Verfasst: Mittwoch 1. Juni 2016, 15:46
Hallo,
zunächst Mal ein paar Infos zu mir......ich bin ziemlich blutiger Anfänger was Python und ctypes betrifft. Mit C, C++ und Java habe ich Erfahrung.
Ich versuche gerade unter Windows mittels ctypes Daten aus einem Shared Memory Bereich zu lesen, welche von einem anderen Programm (dem Spiel Race07) geschrieben werden. Die Struktur der Daten (Telemetriedaten) ist mir bekannt und ich habe in Python eine entsprechende Struktur definiert:
Ich habe den relevanten Shared Memory Filehandle schon erfolgreich geöffnet (zumindest wird kein Fehler geprinted
)
Und jetzt meine Frage bzgl. des Codes nach dem "else" :
Wie kann ich auf die Daten im Shared Memory mittels meiner Struktur zugreifen? In C würde ich einfach einen Pointer mit Typ meiner Struktur erzeugen und dann auf die Adresse zeigen lassen, die "MapViewOfFile" zurückliefert.
Ich habe allerdings keine Ahnung wie ich ....
1) einen solchen Pointer mittels ctypes erzeuge
2) auf die Felder der Struktur zugreifen kann auf die der Pointer zeigt
Ich hoffe, dass ich mein Anliegen einigermaßen verständlich formuliert habe und würde mich über Tips freuen
Grüße,
Mac
zunächst Mal ein paar Infos zu mir......ich bin ziemlich blutiger Anfänger was Python und ctypes betrifft. Mit C, C++ und Java habe ich Erfahrung.
Ich versuche gerade unter Windows mittels ctypes Daten aus einem Shared Memory Bereich zu lesen, welche von einem anderen Programm (dem Spiel Race07) geschrieben werden. Die Struktur der Daten (Telemetriedaten) ist mir bekannt und ich habe in Python eine entsprechende Struktur definiert:
Code: Alles auswählen
class stru(Structure):
_fields_ = [
("float1", c_float),
("float2", c_float),
("float3", c_float),
("float4", c_float),
("float5", c_float),
("float6", c_float),
("engine_rps", c_float),
("max_engine_rps", c_float),
("fuel_pressure", c_float),
("fuel_left", c_float),
("fuel_capacity", c_float),
("engine_water_temp", c_float),
("engine_oil_temp", c_float),
("engine_oil_pressure", c_float),
("car_speed", c_float),
("number_of_laps", c_int32),
("completed_laps", c_int32),
("lap_time_best_self", c_float),
("lap_time_previous_self", c_float),
("lap_time_current_self", c_float),
("position", c_int32),
("num_cars", c_int32),
("gear", c_int32)
]

Code: Alles auswählen
FILE_MAP_ALL_ACCESS = 0xF001F
INVALID_HANDLE_VALUE = 0xFFFFFFFF
SHMEMSIZE = sizeof(stru)
PAGE_READWRITE = 0x04
szName = create_string_buffer(b'$Race$')
szMsg = "Message from Python(ctypes) process"
hMapObject = windll.kernel32.CreateFileMappingA(INVALID_HANDLE_VALUE,
None, PAGE_READWRITE, 0, SHMEMSIZE, szName)
if (hMapObject == 0):
print ("Could not open file mapping object")
raise WinError()
pBuf = windll.kernel32.MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS,
0, 0, SHMEMSIZE)
if (pBuf == 0):
print ("Could not map view of file")
raise WinError()
else:
Wie kann ich auf die Daten im Shared Memory mittels meiner Struktur zugreifen? In C würde ich einfach einen Pointer mit Typ meiner Struktur erzeugen und dann auf die Adresse zeigen lassen, die "MapViewOfFile" zurückliefert.
Ich habe allerdings keine Ahnung wie ich ....
1) einen solchen Pointer mittels ctypes erzeuge
2) auf die Felder der Struktur zugreifen kann auf die der Pointer zeigt
Ich hoffe, dass ich mein Anliegen einigermaßen verständlich formuliert habe und würde mich über Tips freuen

Grüße,
Mac