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/)
-   -   Delphi CreateProcess startet meine Anwendung nicht (https://www.delphipraxis.net/117567-createprocess-startet-meine-anwendung-nicht.html)

little_budda 21. Jul 2008 06:35


CreateProcess startet meine Anwendung nicht
 
Hallo,

ich wollte mal einen Versuch starten eine externe Anwendung zu starten und den Datenstrom selbst in einer Box darzustellen.
Meine Spielwiese besteht aktuell aus zwei Edits und einem Button zum starten.
Edit 1 [ed_app] : "ipconfig"
Edit 2 [ed_para]: "/all"

Ich habe hier im Forum folgenden Code gefunden
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var StartStruct: STARTUPINFO;         // Anweisungen für den Prozess-Start
    ProcInfo: PROCESS_INFORMATION;    // das kriegen wir zurück
    WriteInput, ReadOutput: THandle;  // hierüber können wir mit dem Prozess kommunizieren
    SecAttr: SECURITY_ATTRIBUTES;     // hiermit sagen wir, dass die Handles vererbbar werden sollen
    pAppStr, pAttrStr : PAnsiChar;
begin
  pAppStr := pchar(ed_app.text);
  pAttrStr := pchar(ed_para.text);

  FillChar(StartStruct, SizeOf(StartStruct), #0);

  StartStruct.dwFlags    := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartStruct.wShowWindow := SW_MAXIMIZE;
  StartStruct.cb:=SizeOf(StartStruct);          // Die Größenangabe muss stimmen!

  StartStruct.dwFlags:=STARTF_USESTDHANDLES;    // Wir wollen die Standard-Handles umleiten

  SecAttr.nLength := SizeOf(SecAttr);
  SecAttr.lpSecurityDescriptor := nil;          // Standard-Sicherheit
  SecAttr.bInheritHandle := True;               // vererbbar

  CreatePipe(ReadOutput, StartStruct.hStdOutput, @SecAttr, 0);
  CreatePipe(StartStruct.hStdInput, WriteInput, @SecAttr, 0); //die Handles erzeugen

  CreateProcess(
               pAppStr,        { LPCTSTR              - lpApplicationName   }
               pAttrStr,       { LPTSTR               - lpCommandLine       }
               nil,            { LPSECURITY_ATTRIBUTES - lpProcessAttributes }
               nil,            { LPSECURITY_ATTRIBUTES - lpThreadAttributes  }
               false,          { BOOL                 - bInheritHandles     }
               CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,  { DWORD - dwCreationFlags }
               nil,            { LPVOID               - lpEnvironment       }
               nil,            { LPCTSTR              - lpCurrentDirectory  }
               StartStruct,    { LPSTARTUPINFO        - lpStartupInfo       }
               ProcInfo        { LPPROCESS_INFORMATION - lpProcessInformation }
               );

  CloseHandle(StartStruct.hStdOutput);
  CloseHandle(StartStruct.hStdInput);
  CloseHandle(ProcInfo.hProcess);               // Nur falls du das Prozesshandle nicht brauchst
  CloseHandle(ProcInfo.hThread);

  //jetzt mit ReadFile/WriteFile kommunizieren

  CloseHandle(WriteInput);
  CloseHandle(ReadOutput);
end;
Ich durchblicke diesen Code nicht wirklich, aber er startet jedenfalls keine Anwendung.
Ich wäre schon dankbar für einen Tipp oder eine Erklärung.

Gruß Holger.

:gruebel:

mkinzler 21. Jul 2008 06:52

Re: CreateProcess startet meine Anwendung nicht
 
http://msdn.microsoft.com/en-us/library/ms682425.aspx
Vielleicht würde auch der Rückgabewert helfen, den du arglos wegwirfst.

Apollonius 21. Jul 2008 15:43

Re: CreateProcess startet meine Anwendung nicht
 
Außerdem musst du bedenken, dass Anwendung als ersten Parameter den Pfad zur Echse erwarten - du musst also für lpCommandLine den Inhalt der Edits zusammenfügen und ein bisschen mit Leerzeichen aufpassen.

NickelM 21. Jul 2008 17:51

Re: CreateProcess startet meine Anwendung nicht
 
Folge Codestelle verstehe ICH nicht:

Delphi-Quellcode:
    SecAttr: SECURITY_ATTRIBUTES;     // hiermit sagen wir, dass die Handles vererbbar werden sollen
    pAppStr, pAttrStr : PAnsiChar;
begin
  pAppStr := pchar(ed_app.text);
  pAttrStr := pchar(ed_para.text);
Wäre es nicht sicherer zu schreiben
Delphi-Quellcode:
    SecAttr: SECURITY_ATTRIBUTES;     // hiermit sagen wir, dass die Handles vererbbar werden sollen
    pAppStr, pAttrStr : PAnsiChar;
begin
  pAppStr := PAnsiChar(ed_app.text); //die Richtige typumwandlung???
  pAttrStr := PAnsiChar(ed_para.text);
Könnte es sonst nicht passieren, das er es falsch übernimmt oder verstehe ich da was falsch????

Dezipaitor 21. Jul 2008 22:33

Re: CreateProcess startet meine Anwendung nicht
 
Gleich mal den Kommentar dieser Zeile entfernen. Der passt da einfach nicht hin.
Delphi-Quellcode:
SecAttr: SECURITY_ATTRIBUTES;     // hiermit sagen wir, dass die Handles vererbbar werden sollen
PChar zu PAnsiChar:
PChar ist bis zum Delphi 2008 ein PAnsiChar. Danach ist es ein PWideChar. In C ist es immer ein PAnsiChar.

little_budda 22. Jul 2008 05:38

Re: CreateProcess startet meine Anwendung nicht
 
Hallo,

danke für die vielen Tipps.
ich habe es jetzt wie folgt realisiert und es klappt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var StartStruct: STARTUPINFO;         // Anweisungen für den Prozess-Start
    ProcInfo: PROCESS_INFORMATION;    // das kriegen wir zurück
    WriteInput, ReadOutput: THandle;  // hierüber können wir mit dem Prozess kommunizieren
    SecAttr: SECURITY_ATTRIBUTES;
    pAppStr : PAnsiChar;
begin
  // AnwendungsString zusammenbauen
  pAppStr := pchar('"' + ed_app.text + '" "' + ed_para.text + '"');

  FillChar(StartStruct, SizeOf(StartStruct), #0);

  StartStruct.dwFlags    := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartStruct.wShowWindow := SW_MAXIMIZE;
  StartStruct.cb:=SizeOf(StartStruct);          // Die Größenangabe muss stimmen!

  StartStruct.dwFlags:=STARTF_USESTDHANDLES;    // Wir wollen die Standard-Handles umleiten

  SecAttr.nLength := SizeOf(SecAttr);
  SecAttr.lpSecurityDescriptor := nil;          // Standard-Sicherheit
  SecAttr.bInheritHandle := True;               // vererbbar

  CreatePipe(ReadOutput, StartStruct.hStdOutput, @SecAttr, 0);
  CreatePipe(StartStruct.hStdInput, WriteInput, @SecAttr, 0); //die Handles erzeugen

  if (CreateProcess(
                    nil,            { LPCTSTR              - lpApplicationName   }
                    pAppStr,        { LPTSTR               - lpCommandLine       }
                    nil,            { LPSECURITY_ATTRIBUTES - lpProcessAttributes }
                    nil,            { LPSECURITY_ATTRIBUTES - lpThreadAttributes  }
                    true,           { BOOL                 - bInheritHandles     }
                    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,  { DWORD - dwCreationFlags }
                    nil,            { LPVOID               - lpEnvironment       }
                    nil,            { LPCTSTR              - lpCurrentDirectory  }
                    StartStruct,    { LPSTARTUPINFO        - lpStartupInfo       }
                    ProcInfo        { LPPROCESS_INFORMATION - lpProcessInformation }
                    )) then
    begin
      CloseHandle(StartStruct.hStdOutput);
      CloseHandle(StartStruct.hStdInput);
      CloseHandle(ProcInfo.hProcess);               // Nur falls du das Prozesshandle nicht brauchst
      CloseHandle(ProcInfo.hThread);

      //jetzt mit ReadFile/WriteFile kommunizieren

      CloseHandle(WriteInput);
      CloseHandle(ReadOutput);
    end
  else
    begin
      MessageDlg('Die Anwendung konnte nicht gestartet werden', mtError, [mbOk], 0, mbOk);
    end;
end;
Nun werder ich mich mal mit "ReadFile/WriteFile" beschäftigen.
Gruß Holger.


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