Thema: Delphi Readfile bleibt hängen

Einzelnen Beitrag anzeigen

amokk

Registriert seit: 11. Mai 2011
5 Beiträge
 
#1

Readfile bleibt hängen

  Alt 11. Mai 2011, 15:40
Moin Leute.

Habe folgendes Problem: Ich will mit einem gsec-Befehl prüfen, ob ein gewisser Pfad vorhanden ist - klappt meistens, doch manchmal ist der Text, den die cmd liefert nicht in der Pipe, die ich mit Readfile prüfe -> Readfile bleibt hängen.
Habe schon gelesen, dass das was mit Overlapped zutun hat, wurde aber durch die vorhandenen Beispiele nicht wirklich schlau.

Hier mal der Hauptteil der Funktion:
Code:
function TfrmUser.GsecUser(arc: integer): boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecurityAttr: TSecurityAttributes;
  pipOutW, pipOutR, pipErrW, pipErrR : THandle;
  dwBR: DWORD;
  sCommand: String;
  Buffer: Array [0..254] Of Char;
  erg: Boolean;
begin
  Result := true;
  erg := true;

  FillChar(StartupInfo, SizeOf(StartupInfo), 0);
  FillChar(ProcessInfo, SizeOf(ProcessInfo), 0);
  FillChar(SecurityAttr, SizeOf(SecurityAttr), 0);

  SecurityAttr.nLength             := SizeOf(SecurityAttr);
  SecurityAttr.bInheritHandle      := true;
  SecurityAttr.lpSecurityDescriptor := nil;

  CreatePipe(pipOutR, pipOutW, @SecurityAttr, 0);
  CreatePipe(pipErrR, pipErrW, @SecurityAttr, 0);

  StartupInfo.cb         := sizeof(StartupInfo);
  StartupInfo.hStdInput  := 0;
  StartupInfo.wShowWindow := SW_HIDE;
  StartupInfo.hStdOutput := pipOutW;
  StartupInfo.hStdError  := pipErrW;
  StartupInfo.dwFlags    := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  CreateProcess(nil, PChar(sCommand), nil, nil, true,
                    CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                    nil, nil, StartupInfo, ProcessInfo);

      ReadFile(pipErrR, Buffer, 255, dwBR, nil);

      CloseHandle(pipErrR);

  CloseHandle(pipOutR);
  WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
  CloseHandle(ProcessInfo.hProcess);
  Result := erg;
end;
Habe das überflüssige rausgemacht, also nicht wundern, dass es so komisch eingerückt ist.

Es entscheidet sich zwischen pipErrR und pipOutR, beide können den Text enthalten.
Eine der beiden Pipes bringt Readfile immer zum hängen, daher kann ich auch nicht beide prüfen. Irgendwo muss ein Timeout rein, nur habe ich keine Idee, wie ich diesen programmieren soll.
Ich hoffe mein anliegen ist klar geworden und ihr könnt mir helfen.

Danke schonmal im Vorraus.
  Mit Zitat antworten Zitat