CreateFile Exception
-
Schönen guten Tag,
ich habe eine Anwendung geschrieben, die mit der Funktion CreateFile(...) die einzelnen Com-Ports öffnet und was davon liest. Nun habe ich das Problem, dass der bisherige Testrechner immer 3 Ports hatte und ich das Ausführen von CreateFile(...) 3-mal zugelassen habe. Jetzt ist aber ein neuer Rechner mit nur zwei Ports hinzugekommen. Wenn jetzt beim dritten Mal CreateFile(...) aufgerufen wird, gibt es eine Exception, obwohl ein try{ }catch(...) drumrum ist.
Gibt es eine Möglichkeit, zur Laufzeit die Anzahl der vorhandenen Ports festzustellen?
Bis dann
-
AFAIk sollte da nie eine Exception kommen, sondern einfach nur INVALID_HANDLE_VALUE und GetLastError() = 2... es sei denn Du hast irgendwo einen üngültigen Zeiger übergeben...
Wie sieht den der Code genau aus?
-
try{ RS232::rs_handles[portNumber-1] = CreateFile(port.str().c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); }catch(...){} if (RS232::rs_handles[portNumber-1] == INVALID_HANDLE_VALUE || RS232::rs_handles[portNumber-1]==0) { std::cout<<"Could not open file! System error code: "<<GetLastError()<<std::endl; return false; }
-
Und Du bist sicher dass "RS232::rs_handles" auch gross genug ist?
PS: Nur als Anmerkung: Ab VC8 ist per default so eingestellt, dass ein "catch(...) nur noch C++ Expetions abfängt, also keine GPFs
-
GPFs?
-
Das Array ist auf jedem Fall groß genug. (portNumber = 4)
Wenn ich das Programm debugge, fliegt er immer beim letzten Argument von CreateFile(...), welches null ist raus.
Ich verstehe das Problem auch nicht wirklich, da der Code nicht verändert wurde. Ich denke einfach, dass er nun versucht den Port2 zu öffnen, welcher physikalisch nicht da ist. Warum dann aber kein INVALID_HANDLE zurückgegeben wird, weiß ich nicht.
-
gast666 schrieb:
Wenn ich das Programm debugge, fliegt er immer beim letzten Argument von CreateFile(...), welches null ist raus.
Witzbold... der Debugger kennt fasst Deine 7 Zeilen in eine zusammen und kennt somit immer nur noch die letzte...
Was kommt den genau für eine Exception?
Stimmt "port.str().c_str()" !?@palleon; GPFs: General Protection Failures...
-
Also ich habe meinen Com-Port immer so geöffnet:
CreateFile (interfacename, // CreateFile opens the port by creating a valid handle GENERIC_READ | GENERIC_WRITE, 0, // must be opened with exclusive-access NULL, // no security attributes OPEN_EXISTING,// must use OPEN_EXISTING FILE_FLAG_OVERLAPPED,// overlapped I/O NULL);// hTemplate must be NULL for communication devices
Überprüfe mal, ob das bei dir so richtig ist.
-
Sorry, mit dem Debugger war echt doof.
port.str().c_str() sollte stimmen. Der Code sieht wie folgt aus:
std::stringstream port;
port<<"COM"<<portNumber;wobei portNumber hier 2 ist.
Die Fehlermeldung lautet "Unbehandelte Ausnahme in TDebug.exe 0xc0000005"
-
Hi Paul_C.
ich habe absichtlich das FILE_FLAG_OVERLAPPED nicht benutzt, da ich damit nur Probleme hatte. Außerdem ist die Anwendung ja davor auch reibungslos gelaufen. Ich kann jetzt auch nicht den Zusammenhang zwischen dem FILE_FLAG_OVERLAPPED und dem Fehler erkennen.
Falls du irgend eine Idee hast, warum es ohne FILE_FLAG_OVERLAPPED Probleme geben sollte, kläre mich bitte auf.
-
Mit der Overlapped-Flag hat das IMHO nichts zu tun... Du hast aber nicht nur das geändert sondern auch das "interfacename" durch "port.str().c_str()" ersetzt... ich vermute also eher bei Dir den Fehler
-
Eigentlich ging es mir um das FILE_SHARED_READ. Ich hatte immer gelesen, dort müsste immer eine NULL übergeben werden.
Seltsam ist wirklich mal, dass es vorher geklappt hat bei dir. Hast du denn irgendwas an deinem System geändert?@Jochen: "interfacename" stammt von meinem Programm. War zu faul, es zu ändern.
Hätte vielleicht mehr schreiben sollen, ich gebe es ja zu.
-
Nein, am System habe ich sonst nicht geändert. Werde nochmal weiter testen und versuchen das Problem einzugrenzen. Melde mich, wenn ich was neues habe.
Kann so eine Exception vielleicht entstehen, wenn eine Schnittstelle defekt ist??
-
Ich würde vermuten, dass die dann so behandelt wird, als ob sie nicht da wäre. Aber da bin ich mir nicht sicher.