![]() |
Shellexecute im selben (Konsolen)Fenster
Hallo DP!
Delphi-Quellcode:
Wie kann ich das Konsolenprogramm ext_proc.exe im gleichen Konsolenfenster aufrufen wie meine eigene Anwendung? Es geht immer ein neues Shell Fenster auf...
program Project1;
uses windows, shellapi; {$R *.res} {$APPTYPE CONSOLE} begin allocConsole; try if paramcount=0 then begin writeln('Starte Anwendung ohne Parameter'); ShellExecute(0, 'open', PChar('ext_proc.exe'), nil, nil, SW_SHOW); end; if paramcount=1 then begin writeln('Starte Prolog mit: '+ParamStr(1)); ShellExecute(0, 'open', PChar('ext_proc.exe'+ParamStr(1)), nil, nil, SW_SHOW); end; finally Freeconsole; end; end. |
Re: Shellexecute im selben (Konsolen)Fenster
Vielleicht klappt es mit ShellExecuteEx. Auszug aus dem MSDN zu SHELLEXECUTEINFO:
Zitat:
|
Re: Shellexecute im selben (Konsolen)Fenster
Delphi-Quellcode:
SEE_MASK_NO_CONSOLE:
function ExecAndWait(Filename, Params: String;
WindowState: Word = SW_SHOWNORMAL): boolean; var {$IFDEF UNICODE} ShExecInfoW: SHELLEXECUTEINFOW; {$ENDIF} ShExecInfoA: SHELLEXECUTEINFOA; begin Result := false; if (Filename = '') or not FileExists(FileName) then exit; begin ShExecInfoA.Wnd := GetForegroundWindow; ShExecInfoA.cbSize := sizeof(SHELLEXECUTEINFOA); ShExecInfoA.fMask := [b]SEE_MASK_NOCLOSEPROCESS[/b]; ShExecInfoA.lpVerb := 'open'; ShExecInfoA.lpFile := PAnsiChar(AnsiString(Filename)); ShExecInfoA.lpParameters := PAnsiChar(AnsiString(Params)); ShExecInfoA.lpDirectory := PAnsiChar(AnsiString(ExtractFileDir(Filename))); ShExecInfoA.nShow := WindowState; Result := ShellExecuteExA(@ShExecInfoA); try if Result then WaitForSingleObject(ShExecInfoA.hProcess, INFINITE); finally CloseHandle(ShExecInfoA.hProcess); end; end; end; Damit kann ich die Datei ebenfalls aufrufen, aber es geht trotzdem immer ein neues Fenster auf. |
Re: Shellexecute im selben (Konsolen)Fenster
Dann hab ich im Moment leider auch keine Idee :(
|
Re: Shellexecute im selben (Konsolen)Fenster
Eventuell so:
CreateProcess verwenden und in StartupInfo die Handle der eigenen Anwendung mitgeben (StdIn und StdOut) |
Re: Shellexecute im selben (Konsolen)Fenster
Also nach vielem Herumprobieren kann ich nun die Prolog Anwendung zwar nicht im selben Konsolenfenster starten wie mein eigenes Delphi Programm, ist aber nicht unbedingt zwingend erforderlich. Das Problem ist, ich kann den output vom Prolog-Fenster nicht "lesen". GetConsoleOutput funktioniert in diesem Falle nicht.
Delphi-Quellcode:
Wie kann man denn den output eines externen consolenprogramms als Stringlist/String einlesen?
begin
allocConsole; try if paramcount=0 then begin s:=ExtractFilePath(Application.Exename)+'ext_proc.exe'; s2:='w(wind,feature,W).'; ShellExecute(0, 'open', PChar('ext_proc.exe'), nil, nil, SW_SHOW); //ExecAndWait('ext_proc.exe','', SW_NORMAL); //HANDLE holen sleep(1000); clientHandle:=FindAWindow(s, ''); if clientHandle=0 then begin writeln('Keine handle gefunden !'); readln; end else BringWindowToTop(clientHandle); For I:=1 To Length(s2) Do SendMessage(clientHandle, WM_CHAR, Ord(s2[I]), 0); SendMessage(clientHandle, WM_CHAR, VK_RETURN, 0); writeln('Ich habe fertig, Taste druecken!'); readln; |
Re: Shellexecute im selben (Konsolen)Fenster
Bringt dir
![]() |
Re: Shellexecute im selben (Konsolen)Fenster
Hab ich mal ein einer neuen Anwendung getestet, gibt beim Kompilieren einen Fehler:
[DCC Fehler] Unit1.pas(82): E2010 Inkompatible Typen: 'Char' und 'AnsiChar' in der Zeile : OemToAnsi(Buffer,Buffer) ; |
Re: Shellexecute im selben (Konsolen)Fenster
Und wenn Du String als AnsiString, PChar als PAnsiChar und Char als AnsiChar deklarierst?
|
Re: Shellexecute im selben (Konsolen)Fenster
Dann kann es den Code ausführen, der schmeisst aber beim
Delphi-Quellcode:
eine Zugriffsverletzung. :|
if CreateProcess(nil,
PChar(DosApp), @Security, @Security, true, NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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 by Thomas Breitkreuz