Problem beim Auslesen einer Datei

Hunter

Erfahrenes Mitglied
Hallo,

ich habe derzeit Probleme mit dem Auslesen einer Datei. Undzwar erstelle ich Anfangs eine Datei mit CreateFile() und rufe danach CreateProcess() auf, das dann den Output in die erstellte Datei umleitet. Nun, soweit so gut.
Ich schließe alle Handles, damit ich später die Datei auslesen kann, jedoch bekomme ich immer den Error, dass die Datei noch von einem Prozess verwendet wird.
Was mache ich Falsch?

C++:
//Erstelle Datei
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hOut = CreateFile(pathStdout, GENERIC_ALL, NULL, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
C++:
//Erstelle Prozess
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = hOut;

//CreateProcess();

CloseHandle(pi.hProcess); //Close Handle
CloseHandle(pi.hThread);  //Close Handle
CloseHandle(si.hStdOutput); //Close Handle
C++:
//Lese Datei
if(fopen_s(&hFile, pathStdout, "r") != 0)
return 0;
else {
//....
}
 
Hallo,

das Handle si.hStdOutput ist ungleich NULL, ungleich INVALID_HANDLE_VALUE und ungleich ERROR_INVALID_HANDLE.
Auch bekomme ich mittels GetLastError(), NULL zurück.

Das komische dabei ist, wenn ich nach der Prüfung bei CloseHandle() einen Haltepunkt setzte, dann kann ich die Datei auslesen, ohne Haltepunkt nicht.


EDIT: Lösung gefunden!
Anscheinend geht irgendetwas zu schnell... Ich habe vor dem CloseHandle() einen Sleep() von 100 Millisekunden eingebaut, und es Funktionert. Danke für deine Hilfe! :)
 
Hat du mehrere Threads?
Ja: nicht ausreichend synchronisiert?

Nein: Klassischer Fall von Pointerproblemen (ungültiges Schreiben irgendohin...)
Ist zumindest eine der Möglichkeiten.

edit: Und das hat dann nichts mit der Zeit zu tun, sondern mit den zusätzlichen Bytes für das Sleep
und eventuell anderen Aktionen bei Compileroptimierung usw.
 
Hallo,

"CreateProcess ()" wartet nicht , bis die ausgelöste Aktion tatsächlich beendet ist, sondern läuft nach Absetzen des Befehls sofort weiter. Du solltest daher mit "WaitForSingleObject()" warten, bis der ausgeführte Befehl tatsächlich beendet ist. Dann kannst du auch die Handles ohne Fehler schließen. Fehlerbehebung mittels "Sleep()" ist Murks.

Gruß
MCoder
 
@MCoder
Gut zu wissen, danke. Hab jetzt die Funktion WatiForSingleObjec() eingebaut und es läuft alles Problemlos.

@sheel
Das Schreiben der Datei hat eigentlich immer Problemlos funktioniert. Mehrere Threads hab ich eigentlich auch nicht.
 

Neue Beiträge

Zurück