描述:
有个很奇怪的问题,想请假大家:
1。
假设有一个类CADODatabase,它封装了ADO的常用操作,其构造及析构函数分别初始化COM(::CoInitialize(NULL))和反初始化COM(::CoUninitialize())。
我创建了一个类A,它有一个私有成员变量(CADODatabase m_adoDB)和一个公有的成员函数(ConnDB()),Conn()用于通过m_adoDB连接数据库。
另外我创建了一个UI线程类T,它有一个私有成员变量(A m_A)。对应在该UI线程中的某条消息的操作函数DoSomething()用到了m_A::ConnDB()。
最后,我在MyDialog类中声明了线程T的指针(T* m_pT)。在MyDialog的OnInitDialog()中创建了线程T对象(AfxBeginThread()),并用m_pT指向它。
问题出现了,数据库连接会出现异常。
如下:
CADODataBase Error
Code = 800401f0
Code meaning = 标记没有引用存储
Source = ADODB.Connection
Description = (null)
假如我在DoSomething()函数中,使用m_A::ConnDB()之前初始化COM(::CoInitialize(NULL)),便可正确连接。
2。但我在MyDialog类中声明类A的一个私有成员变量,在MyDialog的OnInitDialog()直接调用m_A::ConnDB()。这样便可正常连接。
这到底是怎么回事呢?情况2,说明类A是没有问题的。在情况1中,既然创建了线程T类的对象,那么T类的类成员也应该构造了呀(事实也是这样,我一步一步跟踪),确实也执行了m_A的构造函数和m_adoDB的构造函数。那么为什么还要初始化COM呢??