[心得]一个值得注意的问题-----CoInitialize(NULL)

aben456 2003-03-24 10:29:52
这天做了一个多线程的程序,在非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();
}


说出来就是希望大家不要再犯同类的错误,千万不要想当然。
...全文
498 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
firedoom 2003-05-04
  • 打赏
  • 举报
回复
感谢ing!
csdn95566 2003-04-18
  • 打赏
  • 举报
回复
感谢共享
mahatma_cn 2003-04-07
  • 打赏
  • 举报
回复
晕,建议搞懂套间模型
loopyifly 2003-04-07
  • 打赏
  • 举报
回复
3X
52001314 2003-04-01
  • 打赏
  • 举报
回复
如果有空的话,大家可以把自己编程的心得或遇到的错误是怎么解决的贴出来。

编程时遇到没见过的错误,会搞得很郁闷的。如果见到别人的经验了,以后也知道怎么避开啊。

谢谢aben456。
yuliangpei 2003-04-01
  • 打赏
  • 举报
回复
谢谢楼主能有这样的胸怀!
我也希望大家以后遇见比较典型或者比较棘手的问题,采用什么手段解决的,能够把他帖出来。同时编程过程中的心得或感悟也可以说一下。这样避免其他人犯同样的错误,也能使我们从别人的感悟中得到一些东西。
gbstar2021 2003-03-28
  • 打赏
  • 举报
回复
每个线程调用 com 组件都需要 CoInitialize(NULL);
并且跨线程调用 com 组件,组件的行为就会变得非常复杂,我觉得这是 com 中最难以理解的部分。
jasn 2003-03-28
  • 打赏
  • 举报
回复
不要化心思去记函数,用的时候去看文档。看的时候他细一点不就可以了,到时后这些函数的用法不就了然于胸了
lashengcrh 2003-03-28
  • 打赏
  • 举报
回复
up
天限天空 2003-03-28
  • 打赏
  • 举报
回复
up
aben456 2003-03-28
  • 打赏
  • 举报
回复
终于捕捉到了错误,原来是连接串的问题
把DSN和无DSN的方式给混了。
CaptainIII 2003-03-27
  • 打赏
  • 举报
回复
路过
aben456 2003-03-27
  • 打赏
  • 举报
回复
问题又来了:

DEBUG版本用着没有问题,
但是release版本出错了,出错在
piConnection->Open(_bstr_t(bcnstr),_bstr_t(bunstr), _bstr_t(bpwdstr),-1);
这一行。
catch (_com_error &e)
catch (CDBException *ce)
都没有结果,GetLaseError()返回是0,FAINT!
wkpeng 2003-03-26
  • 打赏
  • 举报
回复
hao
kite_zeng 2003-03-26
  • 打赏
  • 举报
回复
多多贴出来大家共享,支持
Congy 2003-03-26
  • 打赏
  • 举报
回复
这是com线程模型的问题,套间模式的com线程模型只初始化当前线程,针对每个线程都要进行com库初始化。
aben456 2003-03-26
  • 打赏
  • 举报
回复
至于如何启动多线程,就不用多说了8
:)
aben456 2003-03-26
  • 打赏
  • 举报
回复
以下是辅助线程,程序启动后自动运行:

UINT ADOPROCESS(LPVOID parm)//辅助线程
{
......
CoInitialize(NULL);
adoprocess().... //这样是对的
CoUninitialize();
......
}
Jiemi 2003-03-26
  • 打赏
  • 举报
回复
不懂


CoInitialize(NULL);
adoprocess().... //这样是对的
CoUninitialize();

这样不是在主线程里调用一个函数吗?没有产生分线程啊!
应该是用AfxBeginThread()或CreateThread(),将adoprocess作为工作线程函数实参吧???
maoxianwang 2003-03-26
  • 打赏
  • 举报
回复
记下了
加载更多回复(2)

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧