各位大侠们,小弟在写一段代码时遇到了如下问题,原代码如下:
_RecordsetPtr  pRst(__uuidof(Recordset));
wstring strSQL=_T("select * from [")+sheetname+_T("$]");
pRst=industries->Execute((_bstr_t)(strSQL.c_str()),NULL,adCmdText);
vector<wstring> HYlist;
while(!pRst->adoEOF)
{
wstring temp((wchar_t *)(_bstr_t)(pRst->GetCollect(_T("行业"))));
HYlist.push_back(temp);
pRst->MoveNext();
//if(!pRst->adoEOF)break;//去掉这句的注释则可正常退出
}
这段代码执行了我想要的功能,但是在退出时出现了问题。若代码如上注释,则会在!pRst->adoEOF为true时,出现一个奇怪的错误:
“test1.01.exe 中的 0x7593b9bc 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0039f620 处的 _com_error。”
出错的指示位置在一个名叫free.c的文件中,出错代码段为
void __cdecl _free_base (void * pBlock)
{        int retval = 0;
        if (pBlock == NULL)
            return;        RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));        retval = HeapFree(_crtheap, 0, pBlock);//这一行为指示代码出错段
        if (retval == 0)
        {
            errno = _get_errno_from_oserr(GetLastError());
        }
}
若去掉那句if判断的注释,则程序可以正常退出。小弟才疏学浅,没遇到过如此棘手的问题。请各位大侠不吝赐教。操统win7x64。谢谢!

解决方案 »

  1.   

    while(!pRst->adoEOF)
    {
    wstring temp((wchar_t *)(_bstr_t)(pRst->GetCollect(_T("行业"))));
    HYlist.push_back(temp);
    pRst->MoveNext();
    //if(!pRst->adoEOF)break;//加上这句你的HYlist里只有一个数据
    }
    所以程序出错不在这块,应该是你销毁HYlist时出的错,你单步执行,看退出时HYlist的各值和你不加这句时的各值有什么区别就知道了,这个变量好象类似堆栈
      

  2.   

    做ado的时候,要注意你connection的字符串,印象中如果用LZ这种方法,貌似需要设置游标属性为static