今天一个朋友问我,如下代码出现错误,错误号是80004003,错误含义是“指针错误”。
BOOL CADODatabase::Open(LPCTSTR lpstrConnection, LPCTSTR lpstrUserID, LPCTSTR lpstrPassword)
{
HRESULT hr = S_OK;
if(IsOpen())
Close();
if(strcmp(lpstrConnection, _T("")) != 0)
m_strConnection = lpstrConnection;
ASSERT(!m_strConnection.IsEmpty());
try
{
if(m_nConnectionTimeout != 0)
m_pConnection->PutConnectionTimeout(m_nConnectionTimeout);
hr = m_pConnection->Open(_bstr_t(m_strConnection), _bstr_t(lpstrUserID), _bstr_t(lpstrPassword), NULL);
return hr == S_OK;
}
catch(_com_error &e)
{
dump_com_error(e);
return FALSE;
}
}
void CADODatabase::dump_com_error(_com_error &e)
{
CString ErrorStr;
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
ErrorStr.Format( "CADODataBase Error/n/tCode = %08lx/n/tCode meaning = %s/n/tSource = %s/n/tDescription = %s/n",
e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );
m_strLastError = _T("Connection String = " + GetConnectionString() + '/n' + ErrorStr);
m_dwLastError = e.Error();
AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );
}
CString strConnection = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb");
if(m_pDb.Open(strConnection))
{
m_pRs = CADORecordset(&m_pDb);
if(m_pRs.Open("tblTest", CADORecordset:penTable))
{
m_datagridctrl.SetCaption("Clients");
m_datagridctrl.SetRefDataSource(NULL);
m_datagridctrl.SetRefDataSource((LPUNKNOWN)m_pRs.GetRecordset());
m_datagridctrl.Refresh();
}
}
else
{
AfxMessageBox(m_pDb.GetLastErrorString());
DWORD dwError = m_pDb.GetLastError();
return FALSE;
}
根据错误含义“错误指针”分析,似乎是代码自身的问题。当时怀疑是参数的问题,查看代码确定不会是参数引起。就怀疑是ADO,同时这里也是ADO抛出的异常。因此极有可能是ADO组件的问题。为了确定这点,先找其他机器测试。找了其他一台机器测试后果然正常。因此可以确定是那台机器的ado组件没安装好(极有可能是部分受损)。可以采用如下方法解决:
1.在C:/Program Files/Common Files/System/ado下找到msado15.dll
在命令行输入命令: regsvr32 C:/Program Files/Common Files/System/ado/msado15.dll
回车后,注册该ado模块(如果注册失败,可以将当前路径先到C:/Program Files/Common Files/System/ado目录再进行注册)
运用后能正常。
2.如果如上操作后问题仍然存在,可以将正常机器上的msado15.dll文件复制到 损坏的机器上。再进行第一步的注册操作。