这个问题,我已经提过一回但没得能解决问题的答案
背景是这样的:----------------------------------------------------------
一个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的环境,什么都不改,就仅仅的编译下 就一切正常
=================
各位大侠,你们见过这么奇怪的现象很问题吗 ?
背景是这样的:----------------------------------------------------------
一个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的环境,什么都不改,就仅仅的编译下 就一切正常
=================
各位大侠,你们见过这么奇怪的现象很问题吗 ?
我想你最好查一查ADO方面VC提供了什么东西
这样的话就可以找到答案了
Project->Settings->General->Microsoft Foundation Classes:选择为Use MFC in a Static Library
然后重新编译一下
你机器上的版本低,客户的高,高版本的Access驱动改变了一些行为。安装VC6后,
文件虽然没有被替换,但某些注册信息变了,指向了低版本驱动,因此没问题。
具体原因大概如此,由于时间久远,具体细节记不清了。
我把我机器上的ADO这个文件夹 全部拷到用户机器上
结果也是一样
对这个问题 ,很无奈,也不好跟踪调试
而且用户的系统 也没那么高端(都是用win xp ,2000,2003等 没有用VISTA,WIN7和更高版本)
真是很奇怪----------------------
更让我无奈的是我的机器在重装系统前,一直都没有任何问题也就是说,以前没有问题的,我现在重新在我机器上编译下同样有问题那次系统坏了后,我用的是大白菜那个装了个系统,XP的。 从那以后 ,这个问题一直困扰我一个多月了有人说,ADO版本的问题。我也信,但换了后 ,结果依旧而且,根本不是程序本来的问题
也没法调试 ,因为 我装上VC,什么都不改 ,就编译下 就一切OK呵呵,比较气人的一个问题
根据你说的情况,程序异常退出
1。 那么异常退出的“提示”总该有吧,根据这个提示加上错误代码处也好定位问题
2。再假定,程序直接崩溃:程序已运行就消失的那种,那就用调试工具,用windbg进行调试,在程序“崩溃”时会抛异常,这时进入到调试器(因为你有源码),直接定位到错误代码处,问题也迎刃而解了
3。如果第二步也搞不定,直接到微软下载Process Monitor v2.96程序,跟踪程序启动运行需要加载的资源,两向对比下 基本也能搞定了
如:
regsvr32 msado15.dll
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的版本有很多的问题那这个问题 实际中 又如何解决
The project 'c:\windows\system32\comres.dll' does not matchthe corresponding file on the remote machine.
安装到目标机器上,应该能解决问题
http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=78cac895-efc2-4f8e-a9e0-3a1afbd5922e&DisplayLang=zh-cn
各位大侠真是奇怪啊 我以前没重做系统的时候,09年前的能用的ADO版本的小程序,现在直接给别人用全错误
郁闷啊
m_pConnection.CreateInstance(__uuidof(Connection));
到这,就异常退出了还来不及设置游标
大侠,你看看这个帖子,上面也有你的发言
{
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请问,就没办法了吗 连错误都没法找到
凡是不能在目标机器上不能运行的,用微软的MDAC组件更新下目标机器即可,这时正常的发布流程。
我的电脑,自从用了大白菜做了一次系统后,就出现这样个超级的问题因为,这样的问题 , 你不能调试。因为,你在目标机上一编译,就一切OK。1、有人提示,可能以为ADO版本的问题。但是,我以前就根本没出现任何问题。2、也有大侠提示,VC6自身的问题,但是为什么我09年用VC写的ADO方面的程序,以前在用户那能用,
为什么,我直接把09年编译的RELEASE版本的直接给用户在用,就出问题?3、而且奇怪的是,出现问题的位置在: hr=m_pConnection.CreateInstance(__uuidof(Connection));这里 执行后,m_pConnection为null(或0),而且你用GetLastError得到的是0,成功
希望大家,把这个帖子顶上去
我觉得这个一个超级的难题。在遇到的问题中,这个是最不好定位解决的,就算你定位了你怎么解决----------------------
于是,我想做系统了国庆放假,一定把系统装下
也就是说,在CreateInstance时,返回的m_pConnection为null
客户的机器上的系统 没有win7 之类的高端系统再说是服务器 ,一般都是2000 2003
xp/2k3装过某个QFE补丁后也会改动iid。用ole-com object view检查一下两边机器上msado15.dll中Connection的iid。
文件版本: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的版本号??????????、
C:\Program Files\Microsoft Visual Studio\VB98\Wizards\PDWizard\Redist有个MDAC_TYP.exe 我点击看了下:Microsoft(r) Data Access Components 2.0
测试了一次,使用VS2008编译得到的程序,一样因为msado15.dll的版本问题而不能正常执行。