关于Ado在DLL新建线程中,无法将_ConnectionPtr指针实例化的问题!
2014-11-28 00:00
393 查看
摘要: 在使用ADO的时候,如果初始化COM库的线程和_ConnectionPtr所在线程不是同一个的话,需要在_ConnectionPtr实例化之前加上CoInitialize(NULL),退出线程的时候CoUnInitialize();.
今天用MFC+ADO给老师做项目的时候,老师要求不停的扫描数据库,一旦数据发生变化的时候,就要给他发送消息.并且将变化值交给他.
我就只好写了一个类,编了一个DLL,刚开始的时候是在这个类的构造函数中实例化的代码如下
在主程序中会有
这里主程序的主线程中初始化了COM库,类的构造函数也在主线程中实例化了_ConnectionPtr指针,两者都在同一线程中,自然相安无事.
但是因为我们这个程序实时性要求比较高,还要求与数据库断线重连,不能过分的占用主线程,如果和数据库没有连接的情况下实例化这个类会占用5秒到6秒的时间,因为有一次连接.
后来我拿回来改,想当然的认为只要将
移动到新开的线程中就没事了,此时_ConnectionPtr指针在主线程中实例化,而连接数据库在新开的线程中,这样做是不行的.无法连接到数据库.
但是将
移动到新开的线程中,实例化又会失败.
后来想会不是是COM库的问题,去网上查了很多资料才找到解决的办法,现在记下来,省的以后忘记.
这样问题就解决了!
今天用MFC+ADO给老师做项目的时候,老师要求不停的扫描数据库,一旦数据发生变化的时候,就要给他发送消息.并且将变化值交给他.
我就只好写了一个类,编了一个DLL,刚开始的时候是在这个类的构造函数中实例化的代码如下
//////////////////////////////////////// xx.h //头文件 //////////////////////////////////////// class DATA_BUS_APIC MyDatabase { public: CMyDatabase(); ~CMyDatabase(); . . . static unsigned int __stdcall XXXTheadFun(); private: static _ConnectionPtr m_pDBConnection //ADO连接指针 . . } //////////////////////////////////////// xx.cpp //源文件 //////////////////////////////////////// CMyDatabase::CMyDatabase() { . . . if (FAILED(m_pDBConnection.CreateInstance(__uuidof(Connection)))) { writeErrorLog("bool CMyDatabase::CMyDatabase()函数中数据库链接实例创建失败!"); } try { m_pDBConnection->Open((_bstr_t)m_czDBCon,"","",NULL); } catch(_com_error &e) { writeErrorLog("bool CMyDatabase::CMyDatabase()中连接失败!错误描述:",&e); } . . . }
在主程序中会有
BOOL CXXXXApp::InitInstance() { . . . if(!AfxOleInit()) { AfxMessageBox(_T("AfxOleInit()初始化失败!")); } . . . }
这里主程序的主线程中初始化了COM库,类的构造函数也在主线程中实例化了_ConnectionPtr指针,两者都在同一线程中,自然相安无事.
但是因为我们这个程序实时性要求比较高,还要求与数据库断线重连,不能过分的占用主线程,如果和数据库没有连接的情况下实例化这个类会占用5秒到6秒的时间,因为有一次连接.
后来我拿回来改,想当然的认为只要将
m_pDBConnection->Open((_bstr_t)m_czDBCon,"","",NULL);
移动到新开的线程中就没事了,此时_ConnectionPtr指针在主线程中实例化,而连接数据库在新开的线程中,这样做是不行的.无法连接到数据库.
但是将
FAILED(m_pDBConnection.CreateInstance(__uuidof(Connection)))
移动到新开的线程中,实例化又会失败.
后来想会不是是COM库的问题,去网上查了很多资料才找到解决的办法,现在记下来,省的以后忘记.
//////////////////////////////////////// xx.cpp //源文件 //////////////////////////////////////// unsigned int XXXXTheadFun() //线程回调函数 { CoInitilize(NULL); //在新的线程中初始化COM库 . . . if (FAILED(m_pDBConnection.CreateInstance(__uuidof(Connection)))) { writeErrorLog("bool CMyDatabase::XXXXTheadFun()函数中数据库链接实例创建失败!"); } try { m_pDBConnection->Open((_bstr_t)m_czDBCon,"","",NULL); } catch(_com_error &e) { writeErrorLog("bool CMyDatabase::XXXXTheadFun()中连接失败!错误描述:",&e); } . . . CoUnInitilize(); return 123; }
这样问题就解决了!
相关文章推荐
- 关于Entity Framework 4中保存时抛出"其它线程在运行,无法新建事务"的问题
- 关于在英创em9161板上使用ADO.net连接远程数据库提示 “无法找到 PInvoke dll"dbnetlib.dll"”问题解决方法
- [ADO&VC一]使用ADO智能指针_ConnectionPtr,_CommandPtr及_RecordsetPtr
- 关于“无法定位程序输入点getaddrinfo于动态链接库WS32_32.dll上”的问题
- 【QC开发相关】解决无法创建TDConnection(OTAClient.dll中提供)对象的问题(错误0x800703e6)
- 【VC++ 中使用ADO操作数据库学习笔记】_ConnectionPtr指针的基本用法
- 关于在dll内部建立线程,释放线程的问题?
- 还是关于无法加载DLL(OCI.DLL)问题解决办法!
- VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法
- ADO&VC一]使用ADO智能指针_ConnectionPtr,_CommandPtr及_RecordsetPtr
- 使用ADO智能指针_ConnectionPtr,_CommandPtr及_RecordsetPtr
- ADO接口_ConnectionPtr中Open打开SQl server中的参数设置问题
- 提问:关于动态编译WebService为dll然后调用WebService的问题,无法返回xml文本
- 关于使用Adoeb SVG Viewer在IE中无法正常显示SVG文档的问题
- 关于使用Adoeb SVG Viewer在IE中无法正常显示SVG文档的问题
- 关于“无法定位程序输入点getaddrinfo于动态链接库WS32_32.dll上”的问题
- FILE指针在两个dll中无法正确操作的问题
- 探讨:关于动态编译WebService为dll然后调用WebService的问题,无法返回xml文本
- ADO编程:_ConnectionPtr 等不能识别的问题
- 关于vs2010无法找到rcdll.dll的问题