AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CreateProcess startet meine Anwendung nicht
Thema durchsuchen
Ansicht
Themen-Optionen

CreateProcess startet meine Anwendung nicht

Ein Thema von little_budda · begonnen am 21. Jul 2008 · letzter Beitrag vom 22. Jul 2008
Antwort Antwort
Benutzerbild von little_budda
little_budda

Registriert seit: 5. Mai 2006
Ort: Velbert
246 Beiträge
 
Delphi 2006 Professional
 
#1

CreateProcess startet meine Anwendung nicht

  Alt 21. Jul 2008, 06:35
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.

Holger
Glück findet sich nicht im Code
Gefahren werden ist nur solange schön wie man selbst nicht lenken möchte ...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: CreateProcess startet meine Anwendung nicht

  Alt 21. Jul 2008, 06:52
http://msdn.microsoft.com/en-us/library/ms682425.aspx
Vielleicht würde auch der Rückgabewert helfen, den du arglos wegwirfst.
Markus Kinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: CreateProcess startet meine Anwendung nicht

  Alt 21. Jul 2008, 15:43
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#4

Re: CreateProcess startet meine Anwendung nicht

  Alt 21. Jul 2008, 17:51
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????
Nickel
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#5

Re: CreateProcess startet meine Anwendung nicht

  Alt 21. Jul 2008, 22:33
Gleich mal den Kommentar dieser Zeile entfernen. Der passt da einfach nicht hin.
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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von little_budda
little_budda

Registriert seit: 5. Mai 2006
Ort: Velbert
246 Beiträge
 
Delphi 2006 Professional
 
#6

Re: CreateProcess startet meine Anwendung nicht

  Alt 22. Jul 2008, 05:38
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.
Holger
Glück findet sich nicht im Code
Gefahren werden ist nur solange schön wie man selbst nicht lenken möchte ...
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:43 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