有一天客户现场连接数据库时反馈报错误码0x80004003。 一看是无效的指针,然后定位到在创建实例时全部都失败了。
m_ptrCommand.CreateInstance(__uuidof(Command));
m_ptrRecordset.CreateInstance(__uuidof(Recordset));
m_ptrConnection.CreateInstance(__uuidof(Connection));
if(m_ptrCommand==NULL)
{
m_strErrorMsg = _T("数据库命令对象创建失败");
return false;
}
if(m_ptrRecordset==NULL)
{
m_strErrorMsg = _T("数据库记录集对象创建失败");
return false;
}
if(m_ptrConnection==NULL)
{
m_strErrorMsg = _T("数据库连接对象创建失败");
return false;
}
但是为什么如此,第一反应是ado未进行初始化,但是再看代码中也加入了 CoInitialize(NULL)初始化代码。 百思而不得姐,从而三问度娘。客户确实是xp机器是不是缺少KB983246补丁,缺少对ado连接的支持。但是都一一排除。再从头分析,绝大部分安装现场不出问题,而在这里ado创建实例失败。 我程序中用到的是
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")
由此分析应该是这里出的问题,应该是win7和xp的msado15.dll不同。我把客户现场XP系统下包含msado15.dll的文件夹ado,替换掉我本地win7下的ado文件夹。然后重新编译程序,再在xp下应用,完美解决。
不过为什么会这样?
是因为ADO向下兼容的问题,使用xp的ADO低版本在高版本大多能运行,反之则不行。
WIN7 ADO的文件: msado15.dll,版本:6.1
XP ADO的文件: msado15.dll,版本:2.81
那问题随之而来,如何让ADO兼容所有的系统呢?
#import "msado15.dll" no_namespace rename ("EOF", "adoEOF")
把代码改成这样,然后把xp的msado15.dll复制到工程目录。 这样就能同时兼容xp和win7.