Seite 1 von 1

ctypes pointer problem

Verfasst: Montag 19. Februar 2018, 19:54
von mindthegap
hallo,

ich bin zum ersten mal an ctypes dran, hoppla das ist mühsam.

ich habe ein winDLL mit folgendem prototype:

Code: Alles auswählen

int FEISC_0xB0_ISOCmd( int iReaderHnd, unsigned char cBusAdr, unsigned char* cReqData, int iReqLen, unsigned char* cRspData, int* iRspLen, int iDataFormat )
die argtypes habe ich gesetzt:

Code: Alles auswählen

feisc.FEISC_0xB0_ISOCmd.argtypes = c_int, c_ubyte, c_char_p, c_int, c_char_p, c_int, c_int
feisc.FEISC_0xB0_ISOCmd.restype = c_int
blöd ist halt daß der iRspint nicht als Pointer übergeben werden kann. wie mach ich das? die cRspData sollen 512 Byte sein das mache ich mit

Code: Alles auswählen

rspData = create_string_buffer(512)
rspLeng = 0 #(c_int())
und hier der Aufruf:

Code: Alles auswählen

iBack = feisc.FEISC_0xB0_ISOCmd(iReader, 255, b'0100', 4, rspData, rspLeng, 0x01)
ich denke der Fehler "POINTER_IS_NUL" der dll deutet ja irgendwie auf die beiden response Pointer hin... aber wie übergebe ich die ordnetlich.
wie sieht das aus?

grüße

Re: ctypes pointer problem

Verfasst: Montag 19. Februar 2018, 20:01
von __deets__
pointer(rsp_len) oder byref(rsp_len) solltens tun. Ich glaube für deine Fall ist letzteres die bessere Wahl, weil weniger overhead. Der Unterschied war glaube ich das bei Pointer ein “dickes” Objekt erzeugt wird, und byref sagt “nur den Pointer für den call”. Wenn du den also nicht mehr brauchst, ist byref ausreichend.

Oh, und natürlich auch für die eigentlichen Buffer!

Re: ctypes pointer problem

Verfasst: Montag 19. Februar 2018, 20:04
von __deets__
Nachtrag: ob das so mit dem bytestring als req_data klappt bin ich mir auch nicht so sicher. Das solltest du bei Problemen mal ändern, oder in der Doku lesen wie da eine implizite typwandlung vorgenommen wird.

Re: ctypes pointer problem

Verfasst: Montag 19. Februar 2018, 20:18
von mindthegap
ok,

wenn ich die argtypes vorab setze:
feisc.FEISC_0xB0_ISOCmd.argtypes = c_int, c_ubyte, c_char_p, c_int, c_char_p, POINTER(c_int), c_int

habe ich nicht den fehler mit dem POINTER_IS_NUL. dafür einen neuen. wie würde das denn aussehen wenn es richtig wäre, kann mit das nicht vorstellen, oder kommt das bei der Funktion?

Re: ctypes pointer problem

Verfasst: Montag 19. Februar 2018, 20:49
von __deets__
Was ist denn der Fehler? Ich liege krank im Bett & die Glaskugel ist im anderen Zimmer. Außerdem schlag mal,byref in der Doku nach, da wird das garantiert erklärt.