2016-06-22 7 views
3

Bei der Suche nach anderen ähnlichen Fehlern, denke ich, dass ich ein Problem mit einer illegalen Operation wie Schreiben an eine Adresse habe, die ich nicht sein sollte. Ich bin mir nicht sicher, wie ich das lösen soll. Irgendwelche Hilfe bitte?ctypes, python3.5, OSError: Ausnahme: Zugriffsverletzung schreiben 0x00000000

Genaue Fehler Ich erhalte:

in GetSoftwareVersion() 
result = f(LCP_Version, FCP_Version) 
OSError: exception: access violation writing 0x00000000 

Funktionen I

x = GetSoftWareVersion() 
print(x) 

GetSoftwareVersion bin() aufrufen Inhalt

def GetSoftwareVersion(): 
    f = shim.GetSoftwareVersion 

    LCP_Version = ct.c_char_p(0) 
    FCP_Version = ct.c_char_p(0) 

    result = f(LCP_Version, FCP_Version) 

    if result: 
     print(find_shim_error(result)) 

    return LCP_Version.contents.value, FCP_Version.contents.value 

bearbeiten: Hinzufügen des entsprechenden C++ Code

PCSHIMDLL_API error_status_type GetSoftwareVersion(
     char* LCP_Version, 
     char* FCP_Version 
     ) 
{ 
    error_status_type return_status = SUCCESS; 
    string LCP_V(""); 
    string FCP_V(""); 
    LaserIDType_var laserID; 
    laserID = p_DiagIF->GetLaserID(); 
    LCP_V = laserID->m_LCPSoftwareVersion; 
    FCP_V = laserID->m_FCPSoftwareVersion; 
    strcpy(LCP_Version, LCP_V.c_str()); 
    strcpy(FCP_Version, FCP_V.c_str()); 

    return return_status; 
} 
+2

Was ist 'shim' (ich nehme an, es ist eine C-DLL), und wie sieht' dpcGetSoftwareVersion' Deklaration (und Beschreibung) aus? Ich sehe, dass Sie 2 'NULL'' char' Zeiger übergeben, ist das die Absicht? Die Funktion weist ihnen Speicher zu und speichert dann einige Daten in diesem Speicher (nicht sehr üblich). Oder es erwartet 2 'char *' s, die auf einen "zugewiesenen" Bereich zeigen, in dem die Daten gespeichert werden (basierend auf dem Fehler, der dies zu sein scheint)? Versuchen Sie, sie mit [ctypes.create_string_buffer] (https://docs.python.org/2/library/ctypes.html#ctypes.create_string_buffer) zu initialisieren. – CristiFati

Antwort

3

Sie erhalten den Fehler OSError: exception: access violation writing 0x00000000 wegen der Anweisung LCP_Version = ct.c_char_p(0). Wie von der ctypes documentation for c_char_p vorgeschlagen, übergeben Sie eine Ganzzahl-Adresse.

Was Sie sagen ctypes zu tun ist, ein neues char *-0 zeigen machen, dann zu strcpy, um es über strcpy(LCP_Version, LCP_V.c_str()); versuchen. Wenn Sie ct.c_char_p(1) verwenden würden, erhalten Sie access violation writing 0x0000001, wenn c_char_p(2), dann 0x...2, und so weiter. Es ist sehr unwahrscheinlich, dass Ihr Speicher Ihnen erlauben soll oder kann, dass Sie an diesen Speicherort schreiben können, daher der Fehler.

Was Sie wahrscheinlich tun mögen, ist die Verwendung create_string_buffer(N), wo N die Größe des Arrays ist notwendig, um die Ausgabe von LCP_V = laserID->m_LCPSoftwareVersion; zu enthalten. create_string_buffer, wie der Name schon sagt, erhalten Sie einen veränderbaren Zeichenpuffer, der auf null Bytes initialisiert wird (z. B. p = create_string_buffer(3) bedeutet ist Größe 3, mit Inhalt b'\x00\x00\x00). Sie könnten raten und überprüfen oder die Quelle von p_DiagIF->GetLaserID(); suchen, um den sicheren Wert von N zu jagen, oder geben Sie sich einfach etwas Riesiges (für eine Versionsnummer) wie LCP_Version = ct.c_char_p(50) und wählen Sie etwas vernünftig von dort.