![]() |
Re: Externes von mir gestartes Programm beenden? Hilfe!
Zitat:
|
Re: Externes von mir gestartes Programm beenden? Hilfe!
Liste der Anhänge anzeigen (Anzahl: 1)
Soory, aber der SQL scheint ständig abzuschmieren:
phpBB : Critical Error Also ich kann nichts dafür, daß Hai und Katze wieder Katzenhai spielen und am Netzwerkkabel rumzupfen... hm. Der Hai streitet alles ab. Muss wohl das Kätzchen sein... :roll: Ich versuch nochmal das Attachment |
Re: Externes von mir gestartes Programm beenden? Hilfe!
Hallo firefighter,
ich habe mir Deinen Code einmal angesehen und konnte zwei Probleme entdecken:
|
Re: Externes von mir gestartes Programm beenden? Hilfe!
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo choose,
danke für die schnelle Antwort. Ich habe jetzt ein paar Modifikationen entsprechend Deiner Aussage getroffen und es funktioniert :) Würdest Du mir den Gefallen tun und nochmal darüber schauen, damit ich nicht noch etwas falschen geändert habe? Vielen Dank! Gruss firefighter |
Re: Externes von mir gestartes Programm beenden? Hilfe!
Die beiden Stellen sind in Deiner Version so geändert, dass es funktionieren sollte (habe es aber nicht getestet, Du sagtest schließlich, dass es klappt ;)).
Abschließend eine kleine Anmerkung: Mir fällt auf, dass Deine Routinen auf globalen Variablen basieren, was nicht immer notwendig ist und in einigen Fällen sogar Probleme bereiten kann. Darüber hinaus erschwert die von Dir vorgenommene Formulierung das Erstellen einer Unit mit den gesammelten Funktionen. Falls Du später mehrere Programme gleichzeitig starten und schließen möchtest, wird das ebenfalls nicht funktionieren, weil die Routinen von einer benannten Variablen ausgehen... Deshalb hier eine Variante, die mit lokalen Variablen arbeitet außerdem noch eine andere hübsche Lösung für die CallBack-Funktion, bei der die CallBack-Funktion ebenfalls von außen "nicht sichtbar" ist (Funktioniert allerdings nur, weil ausschließlich lokale Variablen verwendet werden, bei anderen Lösungen also mit Bedacht einsetzen!), verwendet:
Delphi-Quellcode:
out ist neben const und var eine weitere Form des
procedure CloseProcessWindows(const AProcessID: DWord);
function CloseWindowsCB(AHandle :HWND; AProcessID: DWord): LongBool; stdcall; var myProcessID: DWord; begin GetWindowThreadProcessId(AHandle, @myProcessID); // compare process id of AHandle against AProcessID if myProcessID=AProcessID then PostMessage(AHandle, WM_CLOSE, 0, 0); Result:= True; end; begin EnumWindows(@CloseWindowsCB, AProcessID); end; function RunProcess(const AFilename, AParams: string; AWindowState: Word; out AProcessInfo: TProcessInformation): Boolean; const StartFlags = STARTF_USESHOWWINDOW; CreationFlags = CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS; var myStartUpInfo: TStartUpInfo; begin // prepare Startup Info ZeroMemory(@myStartUpInfo, SizeOf(myStartUpInfo)); with myStartUpInfo do begin cb:= SizeOf(myStartUpInfo); dwFlags:= StartFlags; wShowWindow:= AWindowState; end; // create new process using // cmdline - AFilename AParams // currdir - Path of AFilename Result:= CreateProcess(nil, PChar(Format('"%s" %s', [AFilename, AParams])), nil, nil, False, CreationFlags, nil, PChar(ExtractFilePath(AFileName)), myStartUpInfo, AProcessInfo); end; ![]() Der Aufruf könnte dann in etwa so gestalltet sein:
Delphi-Quellcode:
Es bleibt zu überlegen, ob Du statt eines Boolean nicht einfach die ProcessID zurückgiebst und im Fehlerfall eine Exception wirfst. Dann nämlich wäre auch der Einsatz optionaler Parameter eine geeignete Vereinfachung, und die Funktion könnte in dieser vereinfachten Form verwendet werden:
var
myProcessInfo: TProcessInformation; begin //.. if RunProcess(myFilename, myParam, myProcessInfo, SW_SHOW) then begin //.. CloseProcessWindows(myProcessInfo.dwProcessId);
Delphi-Quellcode:
Viel Erfolg!
try
myProcessID:= RunProcess(myFilename); // eq (myFilename, '', SW_SHOW) yourProcessID:= RunProcess(yourFilename, yourParam); //eq (yourFilename, yourParam, SW_SHOW) anotherProcessID:= RunProcess(anotherFilename, anotherParam, SW_HIDE); except on EProcessNotCreatable do //.. end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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