Wenn Sie sich selbst beginnen, den Prozess für die Beendigung Sie warten wollen, zum Beispiel mit Bezug auf die Createprocess, ist das Warten auf den Prozess Ende sehr einfach
WaitForSingleObject(pi.hProcess, INFINITE);
Wenn der Prozess, der Kündigung Sie warten wollen, gestartet wird, bevor Sie die Prozess-ID dwProcessId
des Prozesses finden sollte, und dann gehen Sie wie folgt
HANDLE hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId);
WaitForSingleObject(hProcess, INFINITE);
die Durchsuchung des Prozess-ID in verschiedenen implementiert werden kann, w Sie hängen davon ab, welche Informationen Sie über den Prozess wissen und wie viele Instanzen des Prozesses gleichzeitig ausgeführt werden können. Wenn Sie beispielsweise den Dateinamen des derzeit laufenden Prozesses kennen, können Sie EnumProcesses
, OpenProcess
und GetProcessImageFileName
verwenden. Hier ist der entsprechende Code in vereinfachter Form:
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#include <Psapi.h>
#include <shlwapi.h>
#pragma comment (lib, "Psapi.lib")
#pragma comment (lib, "shlwapi.lib")
int _tmain (int argc, LPCTSTR argv[])
{
DWORD arProcessIds[1024], cbNeeded, i, dwStatus;
HANDLE hProcess = NULL;
LPCTSTR pszProcessName = NULL;
if (argc != 2) {
_tprintf (TEXT("USAGE:\n")
TEXT(" \"%s\" ExeName\n\n")
TEXT("Examples:\n")
TEXT(" \"%s\" TaskMgr.exe\n"),
argv[0], argv[0]);
return 1; // error
}
pszProcessName = argv[1];
if (!EnumProcesses (arProcessIds, sizeof(arProcessIds), &cbNeeded)) {
// here shold be allocated array dynamically
return 1; // error
}
for (i = 0; i < cbNeeded/sizeof(DWORD); i++) {
if (arProcessIds[i] != 0) {
TCHAR szFileName[MAX_PATH];
hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, arProcessIds[i]);
if (hProcess != NULL) {
dwStatus = GetProcessImageFileName (hProcess, szFileName, sizeof(szFileName)/sizeof(TCHAR));
if (dwStatus > 0) {
LPCTSTR pszFileName = PathFindFileName (szFileName);
//_tprintf(TEXT("Process: %s\n"),szFileName);
if (StrCmpI(pszFileName, pszProcessName) == 0) {
break;
}
}
CloseHandle (hProcess);
hProcess = NULL;
}
}
}
//hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId);
if (hProcess == NULL) {
_tprintf(TEXT("The process \"%s\" is not found.\n"), pszProcessName);
return 1;
}
_tprintf(TEXT("Start waiting for the end of the process %s\n"), pszProcessName);
WaitForSingleObject(hProcess, INFINITE);
_tprintf(TEXT("The process is terminated"));
CloseHandle (hProcess);
return 0;
}
Sie sollten genauer definieren, welche Beziehung Ihre Anwendung A mit der Anwendung B hat, die Sie für die Beendigung überwachen möchten. Starten Sie die Anwendung B aus der Anwendung A beispielsweise in Bezug auf 'CreateProcess'? Wenn nicht, dann "Wie identifizierst du die Anwendung B: nach Dateiname, nach Windows-Titel und so weiter?". Ist Anwendung B beispielsweise eine GUI-Anwendung, eine Konsolenanwendung oder ein Windows-Dienst? Ich kann fortfahren ... Ihre aktuelle Frage kann auf vielfache Weise interpretiert werden. – Oleg
Ich habe weitere Informationen hinzugefügt – Newbie