Einzelnen Beitrag anzeigen

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, 06: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