WEB开发网
开发学院软件开发VC 理解 COM 套间 阅读

理解 COM 套间

 2006-07-22 22:58:03 来源:WEB开发网   
核心提示: 以下是运行结果:可以看到,在main中我们创建了一个ITestInterface1接口对象,理解 COM 套间(10),并调用TestFunc1,此处会输出一个线程ID——ThreadID1,如果接收到其它的消息的话,再分发出去,之后主线程生成一个线程,在该线程中

以下是运行结果:

可以看到,在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)
  {
    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;
  }
  该函数用来处理消息的同步,也够麻烦的,还需要自己写这段程序。这段程序的意思是如果等待的事件被激发,那么设置bQuit为TURE,那么退出消息循环。如果接收到其它的消息的话,再分发出去。好了,把我们的程序再改一下:

上一页  5 6 7 8 9 10 

Tags:理解 COM 套间

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接