我已经创建了CreateProcess()
使用 Windows 照片查看器打开图像的过程。由于 Windows Photo Viewer 不是 .exe,它是通过 调用的rundll32.exe
,因此创建了 2 个进程,因此rundll32.exe
成为父进程,Windows Photo Viewer 是子进程。现在我想等待创建子进程。如何等待子进程?
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
CString appStr = L"rundll32.exe \"%ProgramFiles%\\Windows Photo Viewer\\PhotoViewer.dll\" ImageView_Fullscreen C:\\\\img\\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
。
我已经附上了图像,每当我打电话时CreateProcess
,它都会为每个图像创建两个进程,如附件中所示。从任务管理器关闭 rundll32.exe 会同时关闭进程和图像窗口,而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;
}
此代码将正确的子 ProcessID 返回为 12504,但从从中CreateProcess
检索到的 IDpi.dwProcessId
是 12132。
现在我的要求是等待进程 ID 12504 直到它没有被创建。我已经使用下面编写的代码进行了尝试:
while (1)
{
dwChldProcessID = GetChildProcessID(pi.dwProcessId);
hwnd = GetWindowHandle(dwChldProcessID);
if (IsWindow(hwnd))
break;
else
Sleep(100);
}
它正在工作,但还有其他选择吗?