AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Readfile bleibt hängen

Ein Thema von amokk · begonnen am 11. Mai 2011 · letzter Beitrag vom 13. Mai 2011
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz