AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Access Validation bei CreateProcess

Ein Thema von franktron · begonnen am 21. Mai 2012 · letzter Beitrag vom 5. Jul 2017
Antwort Antwort
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Access Validation bei CreateProcess

  Alt 21. Mai 2012, 09:43
Ich habe bei CreateProcess eine Acess Validation

Delphi-Quellcode:
// Konsolen-kommando ausführen und Ergebnis/Fehler zurückliefern
function ExecConsoleCommand(const ACommand: String; var AOutput, AErrors: String;
                            var AExitCode: Cardinal): Boolean;
  var
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    SecurityAttr: TSecurityAttributes;
    PipeOutputRead, PipeOutputWrite,
    PipeErrorsRead, PipeErrorsWrite: THandle;

  // Pipe in einen String auslesen
  procedure ReadPipeToString(const hPipe: THandle; var Result: String);
    var
      AvailableBytes,
      ReadBytes: Cardinal;
      Buffer: String;
  begin
    PeekNamedPipe(hPipe, NIL, 0, NIL, @AvailableBytes, NIL); // wieviel ist da
    while (AvailableBytes > 0) do begin // überhaupt was da?
      SetLength(Buffer,AvailableBytes); // Buffer
      if ReadFile(hPipe,PChar(Buffer)^,AvailableBytes,ReadBytes,NIL) then // Lesen hat geklappt
        if (ReadBytes > 0) then begin // Daten angekommen?
          SetLength(Buffer,ReadBytes); // falls weniger kam, als da ist (warum auch immer)
          Result := Result +Buffer; // an den Ergebnis-String
        end;
      PeekNamedPipe(hPipe, NIL, 0, NIL, @AvailableBytes, NIL); // noch was da?
    end;
  end;

begin
  AOutput := '';
  AErrors := '';
  // Win-API-Strukturen initialisieren/füllen
  FillChar(ProcessInfo,SizeOf(TProcessInformation),0);
  FillChar(SecurityAttr,SizeOf(TSecurityAttributes),0);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.bInheritHandle := TRUE;
  SecurityAttr.lpSecurityDescriptor := NIL;
  CreatePipe(PipeOutputRead,PipeOutputWrite,@SecurityAttr,0);
  CreatePipe(PipeErrorsRead,PipeErrorsWrite,@SecurityAttr,0);
  FillChar(StartupInfo,SizeOf(TStartupInfo),0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.hStdInput := 0;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError := PipeErrorsWrite;
  StartupInfo.wShowWindow := SW_HIDE;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  // http://msdn2.microsoft.com/en-us/library/ms682425.aspx
  Result := CreateProcess(NIL,PChar(ACommand),NIL,NIL,TRUE, <--Hier
                          CREATE_DEFAULT_ERROR_MODE
                          or CREATE_NEW_CONSOLE
                          or NORMAL_PRIORITY_CLASS,
                          NIL,NIL,StartupInfo,ProcessInfo);
  if Result then begin // Prozess erfolgreich gestartet?
    repeat
      GetExitCodeProcess(ProcessInfo.hProcess,AExitCode); // http://msdn2.microsoft.com/en-us/library/ms683189.aspx
      ReadPipeToString(PipeOutputRead,AOutput); // Ausgaben lesen
      ReadPipeToString(PipeErrorsRead,AErrors); // Fehler lesen
      if (AExitCode = STILL_ACTIVE) then
        Sleep(1);
    until (AExitCode <> STILL_ACTIVE); // bis der Prozess sich selbst beendet hat
    CloseHandle(ProcessInfo.hThread); // Handles freigeben
    CloseHandle(ProcessInfo.hProcess);
  end;
  CloseHandle(PipeOutputWrite); // Pipes schließen
  CloseHandle(PipeErrorsWrite);
  CloseHandle(PipeOutputRead);
  CloseHandle(PipeErrorsRead);
end;
Diese Funktion habe ich aus dem Delphi Forum http://www.delphi-library.de/viewtopic.php?p=385387

hat einer eine Idee was da Falsch ist.

Ich nutze Win 7 Pro x64
und Delphi XE2 SP3 Zielplattform ist win32
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Access Validation bei CreateProcess

  Alt 21. Mai 2012, 09:56
Ich bin nicht ganz sicher, meine aber, mich erinnern zu können, dass es aus irgendwelchen Gründen an STARTF_USESTDHANDLES liegt. Hast Du es einmal mit TDOSCommand versucht?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Access Validation bei CreateProcess

  Alt 21. Mai 2012, 09:58
Ich bin nicht ganz sicher, meine aber, mich erinnern zu können, dass es aus irgendwelchen Gründen an STARTF_USESTDHANDLES liegt. Hast Du es einmal mit TDOSCommand versucht?
Nein wollt mich nicht extra dafür an eine Forum Anmelden.
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#4

AW: Access Validation bei CreateProcess

  Alt 21. Mai 2012, 10:01
Der zweite Parameter ist ein INOUT-Parameter (VAR), welcher unter Umständen dort reinschreiben könnte.
Das könnte man eventuell prüfen, denn ich glaub damit hatte vor einer Weile mal jemand ein Problem.

Nimm mal das CONST bei ACommand weg und setze probehalber ein ACommand:=ACommand+#0; SetLength(ACommand, MAX_PATH); vor das CreateFile.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Access Validation bei CreateProcess

  Alt 21. Mai 2012, 10:03
Sirius' Einverständnis vorausgesetzt hänge ich das Archiv einmal an.
Angehängte Dateien
Dateityp: zip DosCommand_2011_v2.03.zip (11,3 KB, 37x aufgerufen)
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Access Validation bei CreateProcess

  Alt 21. Mai 2012, 10:11
Thx Damit gehts
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Access Validation bei CreateProcess

  Alt 5. Jul 2017, 11:07
Moin Leute

Ich weiß, dass der Eintrag alt ist. Ich hatte gerade das gleiche Problem. Das Ergebnis ist der Hammer!

Im Beispielcode ist "ACommand" als String deklariert, was eigentlich WideString sein müsst. Trägt man WideString ein, läuft es.
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz