这天做了一个多线程的程序,在非MAIN的线程里采用ADO方式调用数据库,大家都很熟悉:不就是要加几个申明吗,#import ".\msado15.dll" no_namespace rename( "EOF", "adoEOF" )
、CoInitialize(NULL)、CoUninitialize(); 马上就可以使用了,不是吗??可巧了,我遇到的麻烦是这样的:
测试的时候:
main()
{...
CoInitialize(NULL);
call adoprocess()....//测试时,直接调用没问题
CoUninitialize();
....
}
UINT ADOPROCESS(LPVOID parm)//辅助线程
{
adoprocess().....//程序运行的时候,非主动的触发,结果出错!!!
}
忙了半天,查找出了原因:
CoInitialize(NULL);
之类的申明只对当前线程有效!!!改了以后,就没有问题了。
UINT ADOPROCESS(LPVOID parm)//辅助线程
{
CoInitialize(NULL);
adoprocess().... //这样是对的
CoUninitialize();
}
说出来就是希望大家不要再犯同类的错误,千万不要想当然。
、CoInitialize(NULL)、CoUninitialize(); 马上就可以使用了,不是吗??可巧了,我遇到的麻烦是这样的:
测试的时候:
main()
{...
CoInitialize(NULL);
call adoprocess()....//测试时,直接调用没问题
CoUninitialize();
....
}
UINT ADOPROCESS(LPVOID parm)//辅助线程
{
adoprocess().....//程序运行的时候,非主动的触发,结果出错!!!
}
忙了半天,查找出了原因:
CoInitialize(NULL);
之类的申明只对当前线程有效!!!改了以后,就没有问题了。
UINT ADOPROCESS(LPVOID parm)//辅助线程
{
CoInitialize(NULL);
adoprocess().... //这样是对的
CoUninitialize();
}
说出来就是希望大家不要再犯同类的错误,千万不要想当然。
我调试的时候,到处 get error,最后发现了居然没有初始化,命名调用了,但是还没用,
最后还是老老实实的看了一下文档。============================================================================
DocWizard C++ 程序文档生成工具 http://www.betajin.com/alphasun/index.htm
CoInitialize(NULL);
adoprocess().... //这样是对的
CoUninitialize();这样不是在主线程里调用一个函数吗?没有产生分线程啊!
应该是用AfxBeginThread()或CreateThread(),将adoprocess作为工作线程函数实参吧???
{
......
CoInitialize(NULL);
adoprocess().... //这样是对的
CoUninitialize();
......
}
但是release版本出错了,出错在
piConnection->Open(_bstr_t(bcnstr),_bstr_t(bunstr), _bstr_t(bpwdstr),-1);
这一行。
catch (_com_error &e)
catch (CDBException *ce)
都没有结果,GetLaseError()返回是0,FAINT!
并且跨线程调用 com 组件,组件的行为就会变得非常复杂,我觉得这是 com 中最难以理解的部分。
把DSN和无DSN的方式给混了。