I need a message pump that doesn't mess up my open window

前端 未结 4 1279
自闭症患者
自闭症患者 2021-01-28 02:07

My application (the bootstrap application for an installer that I\'m working on needs to launch some other applications (my installer and third party installers for my installer

4条回答
  •  感动是毒
    2021-01-28 03:08

    I've also posted this question on the Microsoft forums, and thanks to the help of one Doug Harris at Microsoft, I found out my problem with my HWND and HMENU values was, indeed due to stale CWwnd* and CMenu* pointers (obtained using GetMenu() and GetDialogItem() calls. Getting the pointers again after launching the second app solved that problem. Also, he pointed me to a web site* that showed a better way of doing my loop using MsgWaitForMultipleObjects() to control it that doesn't involve the busy work of waiting a set amount of time and polling the process for an exit code.

    My loop now looks like this:

    if (bWait)
    {
      // In order to allow updates of the GUI to happen while we're
      // waiting for the application to finish, we must run a message
      // pump here to allow messages to go through and get processed.
      LONG  nIdleCount = 0;
      for (;;)
      {
        MSG msg;
        if (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
          PumpMessage();
        else //if (!OnIdle(nIdleCount++))
        {
          nIdleCount = 0;
          if (!PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
          {
            DWORD nRes = ::MsgWaitForMultipleObjects(1, &ProcessInfo.hProcess,
                                                     FALSE, INFINITE, QS_ALLEVENTS);
            if (nRes == WAIT_OBJECT_0)
              break;
          }
        }
      }
    }
    ::GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);
    

    *That Web site, if you're curious, is: http://members.cox.net/doug_web/threads.htm

提交回复
热议问题