Autor Beitrag
anno
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Fr 15.08.08 08:59 
Hallo zusammen,

ich wollte mal wissen, wie ich die aktuelle prozessnummer und den namen eines programms herausfinden kann, das ich gerade mit der funktion "ShellExecute" geöffnet habe?

dazu müsste ich dann noch wissen, mit welcher funktion ich einen prozess killen kann.

vielen dank im voraus.

gruß anno


Moderiert von user profile iconGausi: Topic aus VCL (Visual Component Library) verschoben am Fr 15.08.2008 um 09:33
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 15.08.08 09:27 
Starte den Thread mit ShellexecuteEx dann bekommst du die ProzessID. Und mit TerminateProcess* kannst du einen Prozess gewaltsam beenden, was aber nicht zu empfehlen ist, da eventuell geladenen DLLs ihre Ressourcen nicht mehr freigeben können bzw. deren Reefernzzähler nicht dekremntiert wird und sie so unnötig von Windows im Speicher gehalten werden. Besser ist es die Nachricht WM_CLOSE an das Hauptfenster der zu beendenden Anwendung zu schicken und sie so sauber zu beenden.

PS: Das hättest du aber auch alles über die Suche gefunden. :?

*) TerminateProcess arbeitet desweiteren asynchron, das heißt die Funktion kehrt zurück bevor der Prozess wirklich beendet wurde. Nach Rückkehr von TerminateProzess musst du also noch mal prüfen, ob der Prozess wirklich beendet wurde.
anno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 21.08.08 14:27 
hallo,

ich ahbe das ganze mal ausprobiert um damit eine externe "exe" zu starten.


allerdings bekomme ich nie die pid zurück, die ich im taskmanager sehe.

ich bekomme immer nur 3700 zurück.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function test : Boolean;
var
  strDir: String;
  ShExecInfo : SHELLEXECUTEINFO;
  
strDir  := ExtractFilePath("pfad zu der datei");

    ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.lpVerb := nil;
    ShExecInfo.lpFile := PChar(fExePath);
    ShExecInfo.lpDirectory := nil;
    ShExecInfo.nShow := SW_HIDE;

    Result := ShellExecuteEx(@ShExecInfo);

end;


gruss anno
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 21.08.08 14:56 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button2Click(Sender: TObject);
const
  APP = 'c:\Windows\notepad.exe';
var
  si: TStartupInfo;
  pi: TProcessInformation;
begin
  ZeroMemory(@si, sizeof(TStartupInfo));
  ZeroMemory(@pi, sizeof(TProcessInformation));
  if not CreateProcess(nil, PChar(APP), nilnil, False, 0nilnil, si, pi) then
    ShowMessage(SysErrorMessage(GetLastError))
  else
    ShowMessage(IntToStr(pi.dwProcessId));
end;
anno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mo 25.08.08 11:08 
user profile iconLuckie hat folgendes geschrieben:
Besser ist es die Nachricht WM_CLOSE an das Hauptfenster der zu beendenden Anwendung zu schicken und sie so sauber zu beenden.


wie schıcke ich denn eine nachricht an das hauptfenster?

gruss anno
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 25.08.08 12:21 
In der KB findest du bei MS eine Beschreibung mit Beispiel (nicht in Delphi, aber es sollte als Beispiel ja reichen):
support.microsoft.com/kb/178893/en-us/ ;-)

MS empfiehlt dort die Nachricht nicht nur ans Hauptfenster zu schicken:
Zitat:
Post a WM_CLOSE to all Top-Level windows owned by the process that you want to shut down.
anno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mo 25.08.08 12:41 
user profile iconjaenicke hat folgendes geschrieben:
In der KB findest du bei MS eine Beschreibung mit Beispiel (nicht in Delphi, aber es sollte als Beispiel ja reichen):
support.microsoft.com/kb/178893/en-us/ ;-)

MS empfiehlt dort die Nachricht nicht nur ans Hauptfenster zu schicken:
Zitat:
Post a WM_CLOSE to all Top-Level windows owned by the process that you want to shut down.


naja ich möchte das mit delphı allerdings an eine externe anwendung schicken (mit Prozess id).

zudem brauche ich noch eine funktion, mit der ich den "exe-namen" eines prozesses prüfen kann.

gruss anno
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 25.08.08 12:50 
user profile iconanno hat folgendes geschrieben:
möchte das mit delphı allerdings an eine externe anwendung schicken (mit Prozess id).

Um nichts anderes geht es auf der verlinkten Seite.

Zitat:
zudem brauche ich noch eine funktion, mit der ich den "exe-namen" eines prozesses prüfen kann.

Dann mach das doch. Aber falls wir helfen sollen, müsstes du uns noch mitteilen auf WAS die den Namen des Prozess prüfen willst? Korrekte Rechtschreibung, ...
anno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mo 25.08.08 12:53 
user profile iconLuckie hat folgendes geschrieben:
user profile iconanno hat folgendes geschrieben:
möchte das mit delphı allerdings an eine externe anwendung schicken (mit Prozess id).

Um nichts anderes geht es auf der verlinkten Seite.

Zitat:
zudem brauche ich noch eine funktion, mit der ich den "exe-namen" eines prozesses prüfen kann.

Dann mach das doch. Aber falls wir helfen sollen, müsstes du uns noch mitteilen auf WAS die den Namen des Prozess prüfen willst? Korrekte Rechtschreibung, ...


nein ich will nicht dıe rechtsschreıbung prüfen.

nur dass ich eine abhaengıgkeıt zwıschen der pıd und dem prozessname prüfen kann, dass ıch auch wırklıch den rıchtıgen prozess beende.

PS: na also nach delphı sıeht der code aber mal wırklıch nicht aus.