Я создал процесс, используя CreateProcess (), чтобы открыть изображение с помощью окна просмотра фотографий Windows.Поскольку программа просмотра фотографий Windows не является .exe, она запускается с помощью rundll32.exe, что создает процесс 2.таким образом, rundll32 становится родительским процессом, а программа просмотра фотографий Windows - дочерним процессом.Теперь я хочу дождаться создания дочернего процесса.Как ждать дочерний процесс.
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
CString appStr = L"rundll32 \"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\" ImageView_Fullscreen D:\\\\Results\\1.png";
CreateProcess(NULL, // Name of program to execute
CT2W(appStr), // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
TRUE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi);
WaitForSingleObject(pi.hProcess, INFINITE); //its waiting for infinite time.
Он ждет бесконечное время, и если я даю некоторое время в миллисекундах (WaitForSingleObject (pi.hProcess, 500);), то он возвращает WAIT_TIMEOUT.
Я прикрепил изображение, всякий раз, когда я вызываю процесс создания, он создает два процесса для каждого изображения, как вы можете видеть в приложении.Закрытие rundll32.exe из TaskManger закрывает как процесс, так и окно с изображением, где rundll32.exe * 32 не закрывает ни rundll32.exe, ни средство просмотра изображений Windows.
DWORD GetChildProcessID(DWORD dwProcessID)
{
DWORD dwChildProcessID = -1;
HANDLE hProcessSnapshot;
PROCESSENTRY32 processEntry32;
hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnapshot != INVALID_HANDLE_VALUE)
{
processEntry32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnapshot, &processEntry32))
{
do
{
if (dwProcessID == processEntry32.th32ParentProcessID)
{
dwChildProcessID = processEntry32.th32ProcessID;
break;
}
} while (Process32Next(hProcessSnapshot, &processEntry32));
CloseHandle(hProcessSnapshot);
}
}
return dwChildProcessID;
}
Этот код возвращает правильное значениеID дочернего процесса как 12504. Но из процесса создания идентификатор, полученный из pi.dwProcessId, равен 12132.
Теперь мое требование - дождаться, пока идентификатор процесса 12504 не будет создан.Я пробовал это, используя код, написанный ниже.
while (1)
{
dwChldProcessID = GetChildProcessID(pi.dwProcessId);
hwnd = GetWindowHandle(dwChldProcessID);
if (IsWindow(hwnd))
break;
else
Sleep(100);
}
Это работает, но я ищу альтернативный способ поиска.