![]() |
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:
Ich durchblicke diesen Code nicht wirklich, aber er startet jedenfalls keine Anwendung.
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 wäre schon dankbar für einen Tipp oder eine Erklärung. Gruß Holger. :gruebel: |
Re: CreateProcess startet meine Anwendung nicht
![]() Vielleicht würde auch der Rückgabewert helfen, den du arglos wegwirfst. |
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.
|
Re: CreateProcess startet meine Anwendung nicht
Folge Codestelle verstehe ICH nicht:
Delphi-Quellcode:
Wäre es nicht sicherer zu schreiben
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);
Delphi-Quellcode:
Könnte es sonst nicht passieren, das er es falsch übernimmt oder verstehe ich da was falsch????
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); |
Re: CreateProcess startet meine Anwendung nicht
Gleich mal den Kommentar dieser Zeile entfernen. Der passt da einfach nicht hin.
Delphi-Quellcode:
PChar zu PAnsiChar:
SecAttr: SECURITY_ATTRIBUTES; // hiermit sagen wir, dass die Handles vererbbar werden sollen
PChar ist bis zum Delphi 2008 ein PAnsiChar. Danach ist es ein PWideChar. In C ist es immer ein PAnsiChar. |
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:
Nun werder ich mich mal mit "ReadFile/WriteFile" beschäftigen.
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; 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