Ich versuche "Pre-Flight-Checks" zu machen, indem ich die "Erreichbarkeit" eines COM-Ports teste, bevor ich ein Dialogfenster öffne, das dem Benutzer erlaubt, com-porty-Sachen zu machen.Schließen und sofortiges erneutes Öffnen eines COM-Ports schlägt fehl: Warum?
Hier ist die Code-Sequenz, in groben Zügen:
handle = CreateFile("\\\\.\\COM4:", GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);
if (handle != INVALID_HANDLE_VALUE)
{
CloseHandle(handle);
DoTheWork("\\\\.\\COM4:");
}
else
{
ShowMessage("I'm sorry Dave, I can't do that");
}
...
void DoTheWork(char * port)
{
handle = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);
/// do lots of stuff
CloseHandle(port);
}
Hier ist das Problem: „DoTheWork“ ist eine bewährte Funktion und führt richtig auf seine eigenen. Es schlägt nur fehl, wenn es unmittelbar nach den früheren CreateFile/CloseHandle-Aufrufen aufgerufen wird, wenn das zweite CreateFile E_ACCESSDENIED zurückgibt.
Schlimmer noch, wenn ich langsam durch den Code im Debugger Schritt, Es funktioniert ganz gut.
Es scheint, als ob ich nach dem ersten closeHandle einen Sleep() brauche, aber das fühlt sich an wie ein Hack - und ich weiß nicht, wie lange es sein muss.
Warum nicht den Griff offen halten und an DoTheWork weitergeben? – David
@David, ich wollte keinen funktionierenden Teil des Systems anfassen - aber ich habe jetzt keine Wahl ;-) – Roddy