Как ждать дочерний процесс, когда CreateProcess создает 2 процесса, а именно.Процесс rundll32, который создает внутреннюю программу просмотра фотографий Windows. - PullRequest
0 голосов
/ 19 февраля 2019

enter image description here Я создал процесс, используя 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);
}

Это работает, но я ищу альтернативный способ поиска.

1 Ответ

0 голосов
/ 19 февраля 2019

В основном run32dll.exe является исполняемым файлом процесса хоста окна, используемым для размещения любого вида приложения DLL.Я никогда не видел исполняемый файл хостинга run32dll (здесь может быть неправильно).Ваш пример полностью основан на размещении Windows DLL на исполняемый файл run32dll.Следовательно, первое исправление заключается в том, что run32dll не является родительским, а представление изображения окна не является дочерним процессом.Вы можете проверить это в проводнике процесса.enter image description here

код, присутствующий в эта ссылка также возвращает ноль дочерних процессов в 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.
...