描述:
在我的CADOTestDlg对话框应用中,我启动其中的一个成员函数void Fun() 作为工作线程。Fun() 中需要创建 _RecordsetPtr _rsPtr 对象,发现如下情形:
I。无关主线程 OnInitDialog()是否调用 ::CoInitialize(NULL),如果在 Fun() 中自己调用
::CoInitialize(NULL), rsPtr.CreateInstance() 能够创建成功
II。OnInitDialog() 中调用
::CoInitialize(NULL);
cnPtr.CreateInstance(__uuidof(Connection));
不做cnPtr->Open()操作,而在 Fun() 不做 ::CoInitialize(NULL);调用,发现
rsPtr.CreateInstance(__uuidof(Recordset)); 调用失败,rsPtr不能创建,返回错误码:
-2147221008 (800401F0) CoInitialize has not been called.
III。同II,只增加OnInitDialog()中调用 cnPtr->Open() 操作,Fun() 中的rsPtr.CreateInstance() 能够创建成功
不能理解的就是III,为什么主线程中一个cnPtr->Open()操作,其它工作线程中的CoCreateInstance()便能够成功。cnPtr->Open()对于其他线程的COM对象线程模型有什么样子的影响?
// CADOTestDlg 类的成员
_ConnectionPtr cnPtr;
void CADOTestDlg::Fun()
{
// ::CoInitialize(NULL);
_RecordsetPtr _rsPtr ;
HRESULT rs = rsPtr.CreateInstance(__uuidof(Recordset));
if (FAILED(rs))
{
MessageBox("rsPtr.CreateInstance fail...");
}
// ::CoUninitialize();
}
BOOL CADOTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
std::string strConnectString = "Provider=MSDASQL.1;Driver=Microsoft Visual Foxpro Driver;SourceDB=";
strConnectString += "D:\\Data";
strConnectString += ";SourceType=DBF;";
::CoInitialize(NULL);
HRESULT rs = cnPtr.CreateInstance(__uuidof(Connection));
if (FAILED(rs))
{
MessageBox("cnPtr CreateInstance fail...");
}
// cnPtr->Open(strConnectString.c_str(),_bstr_t(""), _bstr_t(""), NULL);
}
解决方案1:
汗。。。的确像III所说的,只要一Open,新建线程都不用CoInitialize了