Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Access Validation bei CreateProcess (https://www.delphipraxis.net/168425-access-validation-bei-createprocess.html)

franktron 21. Mai 2012 08:43

Access Validation bei CreateProcess
 
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

DeddyH 21. Mai 2012 08:56

AW: Access Validation bei CreateProcess
 
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?

franktron 21. Mai 2012 08:58

AW: Access Validation bei CreateProcess
 
Zitat:

Zitat von DeddyH (Beitrag 1167391)
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.

himitsu 21. Mai 2012 09:01

AW: Access Validation bei CreateProcess
 
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
Delphi-Quellcode:
ACommand:=ACommand+#0; SetLength(ACommand, MAX_PATH);
vor das CreateFile.

DeddyH 21. Mai 2012 09:03

AW: Access Validation bei CreateProcess
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sirius' Einverständnis vorausgesetzt hänge ich das Archiv einmal an.

franktron 21. Mai 2012 09:11

AW: Access Validation bei CreateProcess
 
Thx Damit gehts

MacGuyver 5. Jul 2017 10:07

AW: Access Validation bei CreateProcess
 
Moin Leute :hi:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 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