理解 COM 套间
2006-07-22 22:58:03 来源:WEB开发网以下是运行结果:
可以看到,在main中我们创建了一个ITestInterface1接口对象,并调用TestFunc1,此处会输出一个线程ID——ThreadID1。之后主线程生成一个线程,在该线程中,我们会再次生成一个ITestInterface1接口对象,此处再次调用TestFunc1,可以看到输出了另一个线程ID——ThreadID2。因为是不同的对象,所以它们的线程ID号不同。(注意了,此处并没有跨线程调用对象,并不在套间的保护范围)
好了,我们该来看看Single类型的套间了。如果你和我一样懒,不想为此去写一个single类型的接口,那么打开你的注册表。
找到我们的接口ID,在InprocServer32项下,将ThreadingModel的值改为Single,或者将该项删除(这样也代表是Single套间)。我们再来运行该程序,再看运行结果。
当打印出一个线程ID的时候,程序就停止了。Why?刚开始,我也被搞的头晕脑胀。到MSDN中查找WaitForSingleObject,原来WaitForSingleObject会破坏程序中的消息机制,这样在创建的线程中,TestFunc1需要通过消息机制来运行,消息机制破坏,就无法运行了。哎!还的再改程序。在查查《Win32多线程程序设计》,原来在GUI中等待线程需要用MsgWaitForMultipleObjects。好的,我们需要重新写一个函数,专门用来实现消息同步。
DWORD ApartMentMsgWaitForMultipleObject(HANDLE *hHandle,DWORD dwWaitCout, DWORD dwMilliseconds)
该函数用来处理消息的同步,也够麻烦的,还需要自己写这段程序。这段程序的意思是如果等待的事件被激发,那么设置bQuit为TURE,那么退出消息循环。如果接收到其它的消息的话,再分发出去。好了,把我们的程序再改一下:
{
BOOL bQuit = FALSE;
DWORD dwRet;
while(!bQuit)
{
int rc;
rc = ::MsgWaitForMultipleObjects
(
dwWaitCout, // 需要等待的对象数量
hHandle, // 对象树组
FALSE, //等待所有的对象
(DWORD)dwMilliseconds, // 等待的时间
(DWORD)(QS_ALLINPUT | QS_ALLPOSTMESSAGE) // 事件类型
);
//等待的事件激发
if( rc == WAIT_OBJECT_0 )
{
dwRet = rc;
bQuit = TRUE;
}
//其他windows消息
else if( rc == WAIT_OBJECT_0 + dwWaitCout )
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage (&msg);
DispatchMessage(&msg);
}
}
}
return dwRet;
}
更多精彩
赞助商链接