Einzelnen Beitrag anzeigen

kaju74

Registriert seit: 22. Okt 2003
185 Beiträge
 
#8

AW: Prüfen, ob Executeable eine Konsolenanwendung ist

  Alt 15. Apr 2016, 09:51
Ich würde mich ja eher um das "Einfrieren" kümmern und das abstellen
Einfrieren, tut folgender Code:

Code:
    if CreateProcess(nil, PChar(TNXStrings.Format(FileName, Params)), @SecAttributes, @SecAttributes, True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, Process) then
    try
      { loop while running }
      repeat
        { update running flag }
        Running := WaitForSingleObject(Process.hProcess, 100);

        { loop while data available }
        repeat
          { read output block... }
          Read := 0;
          ReadFile(ReadHandle, Buffer[0], BufSize, Read, nil);
          Buffer[Read] := #0;

          { ...and convert it to ansi }
          OemToAnsi(Buffer, Buffer);

          { callback assigned? }
          if Assigned(Callback) then
            Callback(string(Buffer));
        until (Read < BufSize);

        { process messages }
        Application.ProcessMessages;
      until (Running <> WAIT_TIMEOUT);

      { set result }
      Result := True;
    finally
      { close handles }
      CloseHandle(Process.hProcess);
      CloseHandle(Process.hThread);
    end;
und dabei die Zeile:

Code:
ReadFile(ReadHandle, Buffer[0], BufSize, Read, nil);
Falls einer weiß, warum...?!?

Aber eine normale App gibt ja nichts in StdOut zurück und beendet sich nicht sofort...wahrscheinlich wartet der Prozess dann auf die Beendigung des Mainthreads und kommt dabei nicht weiter...

MArc
  Mit Zitat antworten Zitat