作者提到:
1、如果线程调用CoInitializeEx()是使用到了COINIT_APARTMENTTHREADED标识时,那么它将执行在私有的套间中,任何其他的线程都不会进入这个套间。
但是我在开发过程中发现竟然有不同的事情:
1、在程序的CXXXXApp类中有成员变量 A m_A,这个变量是对ADO对象的封装类,使用到了COM库,并在A的构造函数中使用到了CoInitialize():
2、在CXXXXApp::InitInstance中调用了一些ADO对象的方法,对m_A进行初始操作。
3、在CXXXXApp::InitInstance中创建一子线程,并将m_A作为参数传给该子线程。为什么可以在这个子线程用m_A呢,这个子线程可没有进入m_A的套间啊?

解决方案 »

  1.   

    m_A只是一个普通的成员变量,套间之间不能直接用的是COM接口。
      

  2.   

    但是,A类封装了ADO类的对象啊(如Connection,Recordset,Command,Field,Error,Parameter等)m_A是A类的对象啊。而且是作为线程的参数传入的。
      

  3.   

    但是有一个问题。如,在一个单线程的测试程序里面,在程序运行,网络断开时,调用Connection的Open函数会返回错误的,网络连接后,又能成功调用,并建立有效连接。
    如果在作为参数传入时,在程序运行,网络断开时,调用Connection的Open函数会成功的,网络重新连接后,又能成功调用,并建立无效的连接,即看似正常的连接,在执行数据库操作蝗,又被检测到是连接断开。