这天做了一个多线程的程序,在非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();
}
说出来就是希望大家不要再犯同类的错误,千万不要想当然。

解决方案 »

  1.   

    说得太对了,我也是看了文档,才知道需要这样做的。呵呵
    我调试的时候,到处 get error,最后发现了居然没有初始化,命名调用了,但是还没用,
    最后还是老老实实的看了一下文档。============================================================================
    DocWizard C++ 程序文档生成工具 http://www.betajin.com/alphasun/index.htm
      

  2.   

    不懂
    CoInitialize(NULL);
    adoprocess()....                  //这样是对的
    CoUninitialize();这样不是在主线程里调用一个函数吗?没有产生分线程啊!
    应该是用AfxBeginThread()或CreateThread(),将adoprocess作为工作线程函数实参吧???
      

  3.   

    以下是辅助线程,程序启动后自动运行:UINT ADOPROCESS(LPVOID parm)//辅助线程
    {
    ......
    CoInitialize(NULL);
    adoprocess()....                  //这样是对的
    CoUninitialize();
    ......
    }
      

  4.   

    这是com线程模型的问题,套间模式的com线程模型只初始化当前线程,针对每个线程都要进行com库初始化。
      

  5.   

    问题又来了:DEBUG版本用着没有问题,
    但是release版本出错了,出错在
    piConnection->Open(_bstr_t(bcnstr),_bstr_t(bunstr), _bstr_t(bpwdstr),-1);
    这一行。
    catch (_com_error &e)
    catch (CDBException *ce)
    都没有结果,GetLaseError()返回是0,FAINT!
      

  6.   

    每个线程调用 com 组件都需要 CoInitialize(NULL);
    并且跨线程调用 com 组件,组件的行为就会变得非常复杂,我觉得这是 com 中最难以理解的部分。
      

  7.   

    终于捕捉到了错误,原来是连接串的问题
    把DSN和无DSN的方式给混了。
      

  8.   

    如果有空的话,大家可以把自己编程的心得或遇到的错误是怎么解决的贴出来。编程时遇到没见过的错误,会搞得很郁闷的。如果见到别人的经验了,以后也知道怎么避开啊。谢谢aben456。