我写了一个简单的基于对话框的程序,在点击菜单打开文件时,会出现如下错误,请问是什么原因,该如何查啊?
出错部分代码如下:
// 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大小)
请教各位这种错误应该如何进行检查,大概原因是什么?谢谢大家!!!
出错部分代码如下:
// 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大小)
请教各位这种错误应该如何进行检查,大概原因是什么?谢谢大家!!!
if ( dlg.DoModal()!=IDOK ) return;
//获取文件的绝对路径
CString sFileName=dlg.GetPathName();
这个本身没问题,可能是你后面对CString的处理有问题,你仔细检查下看,把后面的代码再贴上来看看
代码如下:
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的使用没有什么关系吧?
把debug文件夹或者Release文件夹全删掉重建工程试试