C++ MsgWaitForMultipleObjects异常将Internet Explorer浏览器帮助对象迁移到Google Chrome

C++ MsgWaitForMultipleObjects异常将Internet Explorer浏览器帮助对象迁移到Google Chrome,c++,events,activex,msmq,bho,C++,Events,Activex,Msmq,Bho,我们的内部应用程序包括一个Browser Helper Object(BHO),用于通过调用两个DLL的方法来处理一些异步函数(外围设备等),它基于ActiveX支持在Internet Explorer中工作 我们需要删除ActiveX的任何使用,并让应用程序在其他浏览器(即Google Chrome)中工作,因此我们构建了一个API REST服务,允许我们调用DLL的方法,在大多数情况下,它工作正常,但是对于一个特定的方法,当API REST服务调用时,存在访问冲突(0xC0000005)在W

我们的内部应用程序包括一个Browser Helper Object(BHO),用于通过调用两个DLL的方法来处理一些异步函数(外围设备等),它基于ActiveX支持在Internet Explorer中工作

我们需要删除ActiveX的任何使用,并让应用程序在其他浏览器(即Google Chrome)中工作,因此我们构建了一个API REST服务,允许我们调用DLL的方法,在大多数情况下,它工作正常,但是对于一个特定的方法,当API REST服务调用时,存在访问冲突(0xC0000005)在Windows和Service停止中,在调用DLL后进行了大量调试,发现错误在下面的C++代码中。此代码使用MSMQ“流动”外围设备软件的请求/应答,在IE ActiveX调用时工作正常,但在API Rest服务调用时失败:

  while (TRUE)
  { // Wait until the main application thread asks this thread to do
    // a process
    dwRet = MsgWaitForMultipleObjects( 1                ,
                                       &hEventEndThread ,
                                       FALSE            ,
                                       INFINITE         ,
                                       QS_ALLINPUT       );
    if (dwRet == WAIT_OBJECT_0)
    { // Exit the thread if the main application sets the "end thread"
      // event. The main application will set the "start process" event
      // after setting the "end thread " event.
      break; // Terminate this thread by exiting the proc.
    }
    else
    {
      if (dwRet == WAIT_OBJECT_0 + 1)
      {
        while (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
        {
          TranslateMessage(&msg);
          DispatchMessage(&msg);     /// This is the line where the Windows Access Violation occurs
        }
        continue;
      }
      else
      {
        continue;
      }
    }
  }
我们发现异常是在DispatchMessage(&msg)中引发的;我们怀疑这段代码可能与IE BHO功能有关,但不确定它或“修复它”的方法,我们尝试从QS_ALLINPUT更改MsgWaitForMultipleObjects标志,结果如下:

  • QS_输入:没有例外,但预期的过程没有进行
  • QS_POSTMESSAGE:有例外
  • QS_SENDMESSAGE:没有例外,但预期的过程没有被冲走
我们正在尝试不同的组合,但对这种“猜测”的方式感到不舒服,而且谷歌搜索这些标志的使用也不是很有见地

问题是:

  • MSMQ的发送/到达事件的标志值应该是多少? 或
  • 我们是否应该更改MsgWaitForMultipleObjects方法以了解MSMQ的发送/到达事件
注:我完全知道这是一个复杂的案例(我们已经尝试解决了好几天),并试图将其抽象化为一个SO问题,我非常愿意重新表述

编辑:我们添加了一些日志,发现异常总是在某些消息第三次到达时发生(所有这些都发生在同一秒钟内),我们还打印了msg的属性,并找到以下值:

Wed Feb 05 17:34:38 2020 PeekMessage msg.message: 799
Wed Feb 05 17:34:38 2020 PeekMessage msg.wParam: 1
Wed Feb 05 17:34:38 2020 PeekMessage msg.lParam: 0
Wed Feb 05 17:34:38 2020 PeekMessage msg.hwnd: 2101766
Wed Feb 05 17:34:38 2020 PeekMessage msg.time: 113452640

Wed Feb 05 17:34:38 2020 PeekMessage msg.message: 799
Wed Feb 05 17:34:38 2020 PeekMessage msg.wParam: 1
Wed Feb 05 17:34:38 2020 PeekMessage msg.lParam: 0
Wed Feb 05 17:34:38 2020 PeekMessage msg.hwnd: 397728
Wed Feb 05 17:34:38 2020 PeekMessage msg.time: 113452640

Wed Feb 05 17:34:38 2020 PeekMessage msg.message: 49891
Wed Feb 05 17:34:38 2020 PeekMessage msg.wParam: 2304
Wed Feb 05 17:34:38 2020 PeekMessage msg.lParam: 82366828
Wed Feb 05 17:34:38 2020 PeekMessage msg.hwnd: 397728
Wed Feb 05 17:34:38 2020 PeekMessage msg.time: 113452640
谢谢


Johann

异常发生在通过
PostMessage()
将窗口消息发布到调用线程中的窗口上。哪个
HWND
MSG
中?实际的消息ID是什么?您是否尝试调试到窗口消息处理程序中,
DispatchMessage()
MSG
传递给,以查看该窗口如何处理消息?@RemyLebeau感谢您的见解,我编辑了问题,添加了HWND的值和MSG的其他属性。我们仍在尝试调试窗口消息处理程序。通过
PostMessage()
将窗口消息发布到调用线程中的窗口时出现异常。哪个
HWND
MSG
中?实际的消息ID是什么?您是否尝试调试到窗口消息处理程序中,
DispatchMessage()
MSG
传递给,以查看该窗口如何处理消息?@RemyLebeau感谢您的见解,我编辑了问题,添加了HWND的值和MSG的其他属性。我们仍在尝试调试窗口消息处理程序。