这个问题,我已经提过一回但没得能解决问题的答案
背景是这样的:----------------------------------------------------------
一个ADO方面的小程序,功能:从一个数据库把数据导入到另外一个数据库说明:这个小程序,09年就已经写了。并且在用户那用着一直没问题------------------------------------------------------现状:最近,系统坏了,我用大白菜做了下系统。装了VC6各个需要的常用的东西 都一并装好了。最近,一个用户(已经再使用那个ADO小程序的用户)要求对每个SQL 的操作,比如,插入,删除,更新,SQL的语句 都要写到一个文本里,他要看看。不管用户是什么目地。让你改 咋得改 再说工作量不大然后什么都不改。就加了个写日志的函数,其实就调用了跟文件操作相关的几个函数然后 我编译好了,直接发给用户,让用户替换下 再运行结果,异常退出,线程异常退出
咋 先不说是因为什么 导致的错误
我就是说说一个现象:然后 ,无论我怎么改,怎么就在我机器上没问题,但就在用户 ,就有问题实在没办法,征求用户同意,装了个VC6的环境用一个愤怒的骂人的话来说:么B都没改,要跟踪调试,发现能正常执行然后 我编译好后,在用户那运行,也正常我想,奇怪的很 非要我在用户那编译下 ,程序才能正常为什么呢 ?我什么都没改就是编译了下 下----------------------------------
有人说,我给的用户DEBUG版本的,这个肯定不会,因为DEBUG和RELEASE版本,只要是在机器上编译的 给用户用,就是有问题 --------------------------------------------------------------------然后,我就拼命的加日志也不能帮助我多少因为它在执行BOOL CAdo::ConnectDB()
{ WriteTBInfoError("开始 ConnectDB...."); HRESULT  hr;
CString strbuf;
    try
{
WriteTBInfoError("ConnectDB--0001");
hr=m_pConnection.CreateInstance(__uuidof(Connection));
WriteTBInfoError("ConnectDB--0002");
m_pConnection->CursorLocation=adUseClient;//;adUseServer //游标类型  WriteTBInfoError("ConnectDB--0003");
hr=m_pConnection->Open(m_strConnect,"","",adModeUnknown);//adConnectUnspecified
WriteTBInfoError("ConnectDB--0004");
if(!SUCCEEDED(hr))  
{
strbuf.Format("Connection.Open 操作失败:%s",m_strConnect);
//WriteLog(strbuf);
WriteTBInfoError(strbuf);
return FALSE;
} }
catch(_com_error e)
{ if(m_pConnection->State)
{
m_pConnection->Close();
}
m_pConnection=NULL;
strbuf.Format("连接数据库时发生异常:%s",e.ErrorMessage());
WriteTBInfoError(strbuf);
    return false;
} WriteTBInfoError("ConnectDB 成功!");
return TRUE;
}
---------------------------------------------执行到红色行 , 当前执行的线程退出了也没法跟踪我也没改什么
-----------------------------------跪求 高手 知情者分不多望见谅
------------------------------------------------
总的讲:我的问题:我的机器上编译的程序 我机器上没问题但在用户那有问题,但如果在用户那装一个VC6的环境,什么都不改,就仅仅的编译下 就一切正常
=================
各位大侠,你们见过这么奇怪的现象很问题吗 ?

解决方案 »

  1.   

    应该是客户机环境的问题。装一个VC6的环境,等于客户机的环境发生改变。你尝试在客户机装VC6后,不用编译,看能否运行正常?
      

  2.   

    虽然目前用户问题解决了,但是并不是令人满意的方案
    我想你最好查一查ADO方面VC提供了什么东西
    这样的话就可以找到答案了
      

  3.   

    是不是没有改成静态链接库
    Project->Settings->General->Microsoft Foundation Classes:选择为Use MFC in a Static Library
    然后重新编译一下
      

  4.   

    如果你操作的是Access,这个问题我以前也遇到过,应该是有关支持Access的DLL文件版本不同,
    你机器上的版本低,客户的高,高版本的Access驱动改变了一些行为。安装VC6后,
    文件虽然没有被替换,但某些注册信息变了,指向了低版本驱动,因此没问题。
    具体原因大概如此,由于时间久远,具体细节记不清了。
      

  5.   

    老弟,是你电脑上的C:\Program Files\Common Files\System\ado这个路径下的msado15.dll等文件和客户电脑上不一样造成的,xp的某些版本,win7升级ado后都会出现这个问题,微软居然没有发现过这个bug,那个时候也折腾了我好久,最后把这个文件夹中的东西换为旧版本就完事ok了。
      

  6.   


    我把我机器上的ADO这个文件夹 全部拷到用户机器上 
    结果也是一样
    对这个问题 ,很无奈,也不好跟踪调试
    而且用户的系统 也没那么高端(都是用win xp ,2000,2003等 没有用VISTA,WIN7和更高版本)
    真是很奇怪----------------------
    更让我无奈的是我的机器在重装系统前,一直都没有任何问题也就是说,以前没有问题的,我现在重新在我机器上编译下同样有问题那次系统坏了后,我用的是大白菜那个装了个系统,XP的。 从那以后 ,这个问题一直困扰我一个多月了有人说,ADO版本的问题。我也信,但换了后 ,结果依旧而且,根本不是程序本来的问题
    也没法调试 ,因为 我装上VC,什么都不改 ,就编译下 就一切OK呵呵,比较气人的一个问题
      

  7.   

    要想解决问题,首先需要提供些“蛛丝马迹”,光凭代码执行处的语句不好定位错误
    根据你说的情况,程序异常退出
    1。 那么异常退出的“提示”总该有吧,根据这个提示加上错误代码处也好定位问题
    2。再假定,程序直接崩溃:程序已运行就消失的那种,那就用调试工具,用windbg进行调试,在程序“崩溃”时会抛异常,这时进入到调试器(因为你有源码),直接定位到错误代码处,问题也迎刃而解了
    3。如果第二步也搞不定,直接到微软下载Process Monitor v2.96程序,跟踪程序启动运行需要加载的资源,两向对比下 基本也能搞定了
      

  8.   

    你把ADO所有文件拷过去后,用regsvr32重新注册试试
    如:
    regsvr32 msado15.dll
      

  9.   

    写DUMP文件,然后结合PDB文件用windbg找错误
      

  10.   

    按照各位大侠的指点迷津我远程调试了下当执行到
    m_pConnection.CreateInstance(__uuidof(Connection));
    这时。本机调试中,弹出如下框:
    Microsoft Visual c++
       The project 'c:\program Files\Common Files\System\ado\msado15.dll' does not matchthe corresponding file on the remote machine.
    然后 就异常了
    看来真的跟ADO的版本有很多的问题那这个问题 实际中 又如何解决
      

  11.   

    Microsoft Visual c++
      The project 'c:\windows\system32\comres.dll' does not matchthe corresponding file on the remote machine.
      

  12.   

    去微软下载Microsoft Data Access Components (MDAC)
    安装到目标机器上,应该能解决问题
    http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=78cac895-efc2-4f8e-a9e0-3a1afbd5922e&DisplayLang=zh-cn
      

  13.   


    各位大侠真是奇怪啊 我以前没重做系统的时候,09年前的能用的ADO版本的小程序,现在直接给别人用全错误
    郁闷啊 
      

  14.   


    m_pConnection.CreateInstance(__uuidof(Connection));
    到这,就异常退出了还来不及设置游标
      

  15.   

    TO gamesql:http://topic.csdn.net/u/20090505/21/5999b2db-9899-4e4a-8194-25afecd5702a.html
    大侠,你看看这个帖子,上面也有你的发言
      

  16.   

    现在我在机器上编译好后我把REALEASE版本发给用户结果在BOOL CAdo::ConnectDB()
    {
    CString strbuf;
        try
    {
    DWORD d;//::GetLastError();
    CoInitialize(NULL);
    m_pConnection.CreateInstance(__uuidof(Connection)); d=::GetLastError();

    if(m_pConnection==NULL)
    {

    CString strddd;
    strddd.Format("错误代码……%d",d);
    AfxMessageBox(strddd);
    return FALSE;
    }
    }
    catch(_com_error e)
    {

    strbuf.Format("打开数据库时发生异常 \n:%s",e.ErrorMessage());
    //AfxMessageBox(e.ErrorMessage());
    WriteLog(strbuf);
    //WriteLog(e.Description());
    return FALSE;
    }
    红色那行,m_pConnection为null  并且d=Getlasterror()=0请问,就没办法了吗 连错误都没法找到
      

  17.   

    程序依赖于windows ado组件,原来的系统版本低,现在版本升级了,操作系统都不是xp了,windows 7,
    凡是不能在目标机器上不能运行的,用微软的MDAC组件更新下目标机器即可,这时正常的发布流程。
      

  18.   

    客户那的MSADO15.DLL的版本号 是2.82.4795.0我机器上的是 :2.81.3012.0
      

  19.   

    大侠,我下了MAAC。结果在2003下安装 说 不支持无语
      

  20.   

    我使用的有一个程序,使用ADO访问Oracle,出现了和LZ一样的问题,现在悬而未决,参考参考各位的回帖。
      

  21.   

    可能是VC6本身的问题,以前我们的一个项目,就出现了LZ同样的问题,必须在目标机器上编译才能运行,否则总出现不可预计的异常,由于项目太大所以也一直拖着没有升级到VS2008,但后来实在无法忍受了,升级到VS2008就没有一点问题了,出现这总问题,一时间也说不上来具体是什么原因,只能归咎于编译器了。
      

  22.   


    我的电脑,自从用了大白菜做了一次系统后,就出现这样个超级的问题因为,这样的问题 , 你不能调试。因为,你在目标机上一编译,就一切OK。1、有人提示,可能以为ADO版本的问题。但是,我以前就根本没出现任何问题。2、也有大侠提示,VC6自身的问题,但是为什么我09年用VC写的ADO方面的程序,以前在用户那能用,
     
       为什么,我直接把09年编译的RELEASE版本的直接给用户在用,就出问题?3、而且奇怪的是,出现问题的位置在:   hr=m_pConnection.CreateInstance(__uuidof(Connection));这里   执行后,m_pConnection为null(或0),而且你用GetLastError得到的是0,成功   
    希望大家,把这个帖子顶上去
    我觉得这个一个超级的难题。在遇到的问题中,这个是最不好定位解决的,就算你定位了你怎么解决----------------------
    于是,我想做系统了国庆放假,一定把系统装下
      

  23.   

    用VC自带的Depends去查看一下ado.dll里面加载哪些dll,看看加载是不是有问题
      

  24.   

    TO LS:  我的程序执行到 m_pConnection.CreateInstance(__uuidof(Connection));  m_pConnection=null(或0)了  所以 在往下执行Open就异常了(当时这里没判断,一直以为都能正常)  所以 导致线程退出,
      
      也就是说,在CreateInstance时,返回的m_pConnection为null  
      

  25.   

    典型的DLL HELL问题。百度上搜DLL HELL吧。
      

  26.   

    静态连接MFC库 然后编译一个RELEASE 也不行吗?很诡异的问题、、
      

  27.   

    win7 sp1中的ado的很多类厂和接口iid的值改了,和旧版中的不一样了。动态绑定吧。
      

  28.   


    客户的机器上的系统 没有win7 之类的高端系统再说是服务器 ,一般都是2000 2003
      

  29.   


    xp/2k3装过某个QFE补丁后也会改动iid。用ole-com object view检查一下两边机器上msado15.dll中Connection的iid。
      

  30.   

    msado15.dll怎么通过Depends 这msado15.dll  没看到有CreateIntance 接口?还有,怎么查看msado15.dll的版本 然后直接通过msado15.dll的属性可以看到:产品版本:2.81.3012.0
    文件版本:2.81.3012.0 (xpsp_sp3_qfe.101108-1646)在网上 看到 有人说:应该在注册中查看ADO的版本
    1、HKEY_LOCAL_MACHINE\Software\Microsoft\DataAccess下有Version项 值:2.0.02、HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MDACVer.Version\CurVer] 
    @= "MDACVer.Version.2.70 "
    以上到底哪个才是 ADO的版本号??????????、
      

  31.   

    还有在网上看下 有网友说,装了VC6后,会更别ADO的版本
    C:\Program Files\Microsoft Visual Studio\VB98\Wizards\PDWizard\Redist有个MDAC_TYP.exe 我点击看了下:Microsoft(r) Data Access Components 2.0
      

  32.   


    测试了一次,使用VS2008编译得到的程序,一样因为msado15.dll的版本问题而不能正常执行。
      

  33.   

    编译的操作系统是否为Win7 SP1?如果是的话,而且你又使用了ADO,那么安拉,微软更新SP1弄出来的问题,和你没关系。看看这个:http://support.microsoft.com/kb/2517589/en-us本人也被这个问题困扰了N久才发现的,NND,死微软,没事升级个鸟东西啊,我现在开发用的机器都不敢装SP1了,关掉自动升级。
      

  34.   

    我的系统是 XP professional 版本2002    service pack 3是不是跟这个有关系????
      

  35.   

    XP系统也出这个问题吗?是否升级了KB 983246这个补丁?我所说的问题主要处在这个补丁上面,正如楼上一位大虾说的,微软改了一些接口的IID值,造成了前后不兼容。微软提供的方法之一是在客户机上全都装上KB 983246这个补丁程序,就可以运行了,我没考虑,嫌麻烦。如果你的系统里没有装这个补丁,那可能和我的问题不一样,不过症状完全相同,可以从这个方面入手查一查~~