2017-01-06 5 views
1

Ich habe eine C-Funktion in einer DLL, die so aussieht.Python Ctypes Double De-Referenzzeiger

ProcessAndsend(Format *out,  // IN 
      char const *reqp, // IN 
      size_t reqLen,  // IN 
      Bool *Status,  // OUT 
      char const **reply, // OUT 
      size_t *resLen)  // OUT 

Wenn der Anruf erfolgreich ist, wird etwas in allen OUT-Parametern gespeichert.

Verwenden von Python-Ctypes (unter Windows) Ich möchte den ** Antwortzeiger doppelt de-referenzieren und sehen, was der Wert dort ist.

Dank in Adv.

Antwort

2

Ich habe nicht Ihre Format und Bool Typen, so mit einigen Auswechslungen, hier einige Beispiel-DLL-Code:

#include <stddef.h> 
__declspec(dllexport) void ProcessAndsend(char *out,  // IN 
              char const *reqp, // IN 
              size_t reqLen,  // IN 
              int *Status,  // OUT 
              char const **reply, // OUT 
              size_t *resLen)  // OUT 
{ 
    *Status = 1; 
    *reply = "test"; 
    *resLen = 5; 
} 

Dadurch werden die Ausgangsdaten abrufen. Erstellen Sie einfach einige Instanzen der korrekten Ctypes-Typen und übergeben Sie sie als Referenz:

>>> from ctypes import * 
>>> dll = CDLL('your.dll') 
>>> f = dll.ProcessAndsend 
>>> f.argtypes = c_char_p,c_char_p,c_size_t,POINTER(c_int),POINTER(c_char_p),POINTER(c_size_t) 
>>> f.restype = None 
>>> status = c_int() 
>>> reply = c_char_p() 
>>> size = c_size_t() 
>>> f('abc','def',3,byref(status),byref(reply),byref(size)) 
>>> status 
c_long(1) 
>>> reply 
c_char_p('test') 
>>> size 
c_ulong(5L)