-1

在此处输入图像描述

我已经创建了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);
}

它正在工作,但还有其他选择吗?

4

1 回答 1

1

基本上 run32dll.exe 是用于托管任何类型的 DLL 应用程序的窗口主机进程可执行文件。我从未见过 run32dll 托管可执行文件(这里可能是错误的)。您的示例完全基于 run32dll 可执行文件上的窗口 dll 托管。因此首先更正的是 run32dll 不是父进程,并且窗口图像视图不是子进程。您可以在流程资源管理器中交叉验证这一点。 在此处输入图像描述

链接中的代码还返回 run32dll.exe 下的零子进程。

现在让我们来回答您的问题,您要检查天气窗口照片查看器是否打开。在这种情况下,您自己的代码将帮助您。

以下是几个例子:

CString appStr = L"rundll32 \"C:\\Program Files (x86)\\Windows Photo Viewer\\PhotoViewer.dll\" ImageView_Fullscreen C:\\download.png";

    BOOL result = 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); //it will wait until you are not closing photo view since image is loaded successfully.

由于未打开图像查看器,以下具有错误图像路径的代码将无法执行:

CString appStr = L"rundll32 \"C:\\Program Files (x86)\\Windows Photo Viewer\\PhotoViewer.dll\" ImageView_Fullscreen C:\\dowdsdsdnload.dspng";

            BOOL result = 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); //it will wait until you are not closing photo view since image is loaded successfully.
于 2019-02-19T13:00:29.607 回答