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)
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
Grüsse,
Markus[/code]