直到某些未知情况,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);
}
我有一个用
实例化的 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);
}