直到某些未知情况,COM+ 应用程序才会继续

COM+ app not continuing until some unknown condition

我有一个用

实例化的 COM+ 应用程序
CoCreateInstance(CLSID_TheComponent, NULL, CLSCTX_ALL, IID_ITheComponent, &m_TheComponent);

接下来是事件初始化

CoCreateInstance(CLSID_TransientSubscription,NULL,CLSCTX_ALL,IID_ITransinetSubscription,&Trans);
...some more code that eventually registers some CLSID_Events, IID__IEvents.

我有一个 MFC 应用程序,包含以下内容:

OnBtn1Clicked()
{
  m_TheComponent->DoSomething();
}

在对话框 class 中还有

class CMFCMyDialog : public CDialogEx, _IEvents
{
  ...
  virtual HRESULT STDMETHODCALLTYPE OnSomething(); // abstract in _IEvents

当 运行 时,在单击 Btn1 后会发生两件事:1.OnSomething() 被触发,以及 2. COM+ 做了一堆它应该做的其他事情。到目前为止一切顺利。

有趣的是,1 和 2 仅在 OnBtn1Clicked() 退出后发生。即使我在 DoSomething() 之后放置 sleep() 或者如果我尝试在不同的线程中调用 DoSomething(),1 + 2 也不会仅在 OnBtn1Clicked() 被清除后发生。

从 COM 组件日志我看到它到达并进入它的 OnSomething() 调用但它不存在(当然也不会到达客户端接收器)直到 OnBtn1Clicked() 被清除。清除后,到达接收器,COM 组件继续执行。

所有这些都不是问题,因为我可以在单击按钮后等待,但我需要在控制台应用程序客户端中实现它。在控制台应用程序中实现时,我无法使 1 and/or 2 发生。只有在我终止客户端进程 (!) 2 之后才会发生(COM+ 继续处理)但是当然客户端 OnSomething() 不会因为进程已经死了。

知道清除 OnBtn1Clicked() 后会发生什么影响 COM+ 吗?

MyConsoleClass::MyConsoleClass()
{
    new thread(&MyConsoleClass::Run, this);
}

void MyConsoleClass::Run()
{
    m_ThreadId = GetCurrentThreadId();
    m_IsActive = true;
    MSG msg;
    BOOL bRet;
    while (m_IsActive)
    {
        if (bRet = GetMessage(&msg, NULL, 0, 0) != 0)
        {
            if (bRet == -1)
                // error
            else if (msg.message == WM_QUIT)
                m_IsActive = false;
            else if (msg.message == DO_SOMETHING)
                DoSomething(msg.wParam);
            else
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    }
}

void MyConsoleClass::Invoke(const actionEnum action, const void *params)
{
    PostThreadMessage(m_ThreadId, action, (WPARAM)params, NULL);
}