我写了一个简单的基于对话框的程序,在点击菜单打开文件时,会出现如下错误,请问是什么原因,该如何查啊?
出错部分代码如下:
// TODO: 在此添加命令处理程序代码
//显示文件打开对话框
CFileDialog dlg(TRUE, NULL,"*.txt",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Text Files(*.txt)|*.txt|All Files(*.*)|*.*||"); 
if ( dlg.DoModal()!=IDOK ) return;
//获取文件的绝对路径
CString sFileName=dlg.GetPathName();
CString sFileName=dlg.GetPathName();此句出错,当第一次打开文件时没有报错,第二次打开文件时候报错:“TestFas.exe 中的 0x004f9504 处未处理的异常: 0xC0000005: 读取位置 0x31203441 时发生访问冲突”
点击中断后,在atlsimpstr.h中:
public:
explicit CSimpleStringT( __in IAtlStringMgr* pStringMgr )
{
ATLENSURE( pStringMgr != NULL );
CStringData* pData = pStringMgr->GetNilString();//此处报错,pData值0XCCCCCCCC
Attach( pData );
}
我对MFC不熟,不知道为何运行时第一次点击菜单打开文件没有问题,第二次打开文件就报错(此外,打开的报错文件仅8K大小)
请教各位这种错误应该如何进行检查,大概原因是什么?谢谢大家!!!

解决方案 »

  1.   

    从错误现象看,应该是你的string被破坏了,也许你第一次打开之后某个地方有内存访问越界
      

  2.   

        CFileDialog dlg(TRUE, NULL,"*.txt",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Text Files(*.txt)|*.txt|All Files(*.*)|*.*||"); 
        if ( dlg.DoModal()!=IDOK ) return;
        //获取文件的绝对路径
        CString sFileName=dlg.GetPathName();
    这个本身没问题,可能是你后面对CString的处理有问题,你仔细检查下看,把后面的代码再贴上来看看
      

  3.   


    代码如下:
    void CTextEditDlg::OnMemuFileOpen() 
    {
    //显示文件打开对话框
    CFileDialog dlg(TRUE, "SQL", "*.txt",OFN_HIDEREADONLY
    |OFN_OVERWRITEPROMPT,"Text Files(*.txt)|*.txt|SQL Files(*.sql)|*.sql|All Files(*.*)|*.*||"); 
    if ( dlg.DoModal()!=IDOK ) return;
    //获取文件的绝对路径
    CString sFileName=dlg.GetPathName();
    //打开文件
    CStdioFile out;
    out.Open(sFileName, CFile::modeRead);
    CString sSql="",s;
    //读取文件
    do{
    out.ReadString(s);
    sSql=sSql+s+(char)10;
    }
    while (out.GetPosition()!=out.GetLength());
    out.Close(); 
    m_MyRichEdit.SetWindowText(sSql); 
    }我单步执行的时候,第二次打开文件时,发现到这行就出错了CString sFileName=dlg.GetPathName();
    好像跟后面对CString的使用没有什么关系吧?
      

  4.   

    把你的这段代码考过来,是n次都没什么问题,文件用是10k的都没什么问题。
    把debug文件夹或者Release文件夹全删掉重建工程试试