试试用下面的函数扑捉一下错误,然后再好好分析一下,应该能找到。
/////////////////////////////void OutputComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description()); 
    char bstrOutput[1024]; sprintf(bstrOutput, "Code = %08lx\nCode meaning = %s\nSource = %s\nDescription = %s\n",
e.Error(), e.ErrorMessage(), (LPCSTR) bstrSource, (LPCSTR) bstrDescription);

MessageBox(NULL,(LPCTSTR)bstrOutput, "ADO Com Error !", MB_ICONERROR | MB_OK);
}
////////////////////////////
用法:
try
{              .......
}
catch (_com_error &e)
{
OutputComError(e);
}