ctypes Problem / WindowsError

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MBR
User
Beiträge: 29
Registriert: Freitag 29. September 2006, 17:03

Guten Abend Python Gefährten,

habe ein Problem mit dem ctypes Modul, genauer gesagt mit einem WindowsError, und komme momentan einfach nicht weiter, bzw. weiß nicht mehr wo ich suchen soll. Folgendes:

Habe mit VisualStudio2005 eine DLL geschrieben, welche ich über ctypes in Python ansprechen möchte. Funktionierte bis hierhin auch ohne Probleme, bis ich eine bestimmte Funktion innerhalb der DLL ansprechen wollte. Daraus resultierte dann der folgende Fehler:

WindowsError: exception: access violation reading 0x0000005C

Innerhalb der betroffenen Funktion wird eine MMS-Verbindung zu einem Server aufgebaut. Nachfolgend der C-Code:

DllExport int mvl_connect(char *clientAR, char *serverAR, int hdl)
{

ST_RET ret = 1;
MVL_REQ_PEND *reqCtrl;
ACSE_AUTH_INFO *authInfo = NULL; // Authentifizierung
S_SEC_ENCRYPT_CTRL *encryptCtrl = NULL; // Verschluesselung
MVL_NET_INFO *clientNetInfo = NULL;
INIT_INFO callingInitInfo;
INIT_INFO initRespInfo;
//Pruefung handle existent
if (mvlVars[hdl].handle == -1)
//nicht existent -> Fehler
return(0);
//INIT_INFO Struktur fuellen
callingInitInfo.mms_p_context_pres = SD_TRUE;
callingInitInfo.max_segsize_pres = SD_TRUE;
callingInitInfo.max_segsize = mvlCfg.max_msg_size;
callingInitInfo.maxreq_calling = 1;
callingInitInfo.maxreq_called = 1;
callingInitInfo.max_nest_pres = SD_TRUE;
callingInitInfo.max_nest = 5;
callingInitInfo.mms_detail_pres = SD_TRUE;
callingInitInfo.version = 1;
callingInitInfo.num_cs_init = 0;
callingInitInfo.core_position = 0;
callingInitInfo.param_supp[0] = m_param[0];
callingInitInfo.param_supp[1] = m_param[1];
memcpy (callingInitInfo.serv_supp, m_service_resp,11);
//MMS initiate request

//PROBLEMZEILE:
ret = mvla_initiate_req_ex (serverAR, &callingInitInfo,
&initRespInfo, &clientNetInfo,
&reqCtrl, authInfo, encryptCtrl);

//Check initiate response
if (ret == SD_SUCCESS)
{
//kein Fehler
ret = waitReqDone (reqCtrl, timeOut+60);
return(1);
}
if (ret != SD_SUCCESS)
{
//Fehler
//mvlVars[hdl].clientNetInfo = NULL;
//Fehlercode -> String -> Rueckgabe
return(0);
}
}

Wenn ich die Problemzeile innerhalb des C-Codes auskommentiere läuft alles einwandfrei. Somit gehe ich mal davon aus, dass Parameter, sowie Rückgabe einwandfrei implementiert sind. Alle anderen Funktionen laufen auch, der Fehler resultiert einzig aus dem Funktionsaufruf der markierten Stelle. Mit dem Fehler selbst kann ich so gut wie garnichts anfangen, habe schon eine Menge gegoogelt, ohne Erfolg, leider! Bin dankbar für jeden möglichen Hinweis. Was kann innerhalb einer DLL-Funktion schieflaufen, dass einen solchen Fehler verursacht? Die Funktion ist in einem ausführbaren C-Konsolenprogramm getestet und läuft dort Fehlerfrei.

Kann es Probleme geben, wenn innerhalb des C-Codes interne Callback Funktionen aufgerufen werden (innerhalb der DLL)??

Hier mein Pythoncode:

Anbindung DLL:

Code: Alles auswählen

def __init__(self):    
        print "MMScon starting..."
        #DLL Verbindung herstellen
        self._dll = cdll.LoadLibrary("CTS_MMSconV0_35.dll")        
        #MVL Konfiguration laden
        back = self.__load_config("c:/mvl_config.xml")
        #Pruefung Laden erfolgreich
        if (back == 0):
            print("Unable to load mvl configuration. System exit.")
            exit(0)
Aufruf Funktion:

Code: Alles auswählen

def connect(self, clientAR, serverAR, hdl):
        #MMS Initiate Funktion (Connection herstellen)
        result = c_int()
        handle = c_int(hdl)
        cltAR = c_char_p(clientAR)
        srvAR = c_char_p(serverAR)
        connect_func = self._dll.mvl_connect
        print "CONNECT: " + str(connect_func)
        connect_func.restype = c_int
        connect_func.argtypes = [c_char_p, c_char_p, c_int]
        result = connect_func(cltAR, srvAR, handle)
        return result 
Vielen Dank für eure Hilfe!

Grüsse,
Markus[/code]
BlackJack

Kommt die Meldung wirklich beim Aufruf oder erst etwas später? Wenn Deine Python-Funktion endet, dann verschwindet auch das `ctypes`-Pointerobjekt `srvAR` weil's ein lokaler Name ist. Ich bin mir nicht 100%ig sicher, aber ein Zugriff darauf könnte dann irgendwo hin führen wo man nicht lesen darf.
MBR
User
Beiträge: 29
Registriert: Freitag 29. September 2006, 17:03

Hallo BlackJack,

danke für deine Antwort!

Es ist leider tatsächlich so, dass die Meldung beim Aufruf erfolgt, bzw. wenn die Funktion abgearbeitet wird. Die Variablen habe ich zum Testen schon global angelegt, keine Änderung.

Bin immer noch ratlos! Möglicherweise spielen aber auch die Unterschiede (Möglichkeiten) einer DLL zu einer normalen EXE ein Rolle?! Kenne mich da aber nicht so aus. Inwiefern hat eine DLL denn ihre Grenzen?

Gruß,
Markus
Antworten