CFileDialog问题。异常退出
staticcharBASED_CODEszFilter[]="打开文件(*.*)|*.*||\0";CFileDialogfileDialog(TRUE,0,0,OFN...
static char BASED_CODE szFilter[]= "打开文件 (*.*)|*.*||\0";
CFileDialog fileDialog(TRUE,0,0,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
if (IDOK == fileDialog.DoModal())
{
CString strFileName;
strFileName = fileDialog.GetPathName();
}
就这样一段代码,第一次我打开一个文件(随便什么文件),第二次我在弹出这个文件保存对话框,把鼠标移到一个文件上停留片刻,程序就会马上退出。有人遇到过这种问题吗?怎么解决??
我没写保存。只有这个。跟踪了堆栈,是调用shell32.dll的时候出错,我怀疑是微软的问题,我这里人和我一样的情况,但是把原码发给其他人是没问题的。。所以又怀疑是不是和机器上某些软件有冲突..我也说过我这里有位朋友同样的代码也是没问题的,所以我想会不会和机器有关系,或者和某些软件冲突。
麻烦给出一个解决方案啊!谢谢了
不过我自己加了AfxOleInit()问题已经解决,但是我不知道这个的原理 展开
CFileDialog fileDialog(TRUE,0,0,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
if (IDOK == fileDialog.DoModal())
{
CString strFileName;
strFileName = fileDialog.GetPathName();
}
就这样一段代码,第一次我打开一个文件(随便什么文件),第二次我在弹出这个文件保存对话框,把鼠标移到一个文件上停留片刻,程序就会马上退出。有人遇到过这种问题吗?怎么解决??
我没写保存。只有这个。跟踪了堆栈,是调用shell32.dll的时候出错,我怀疑是微软的问题,我这里人和我一样的情况,但是把原码发给其他人是没问题的。。所以又怀疑是不是和机器上某些软件有冲突..我也说过我这里有位朋友同样的代码也是没问题的,所以我想会不会和机器有关系,或者和某些软件冲突。
麻烦给出一个解决方案啊!谢谢了
不过我自己加了AfxOleInit()问题已经解决,但是我不知道这个的原理 展开
3个回答
展开全部
哈哈,这个问题我遇过,我先说一下我的情况,我的环境是VC6,使用是最新的SDK,我在stdafx.h里加入了
#define _WIN32_WINNT 0x0501
因为我想用最新的函数,否则条件编译过不去,问题就出在这个宏定义上,为什么呢?
因为在
CFileDialog::CFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags,
LPCTSTR lpszFilter, CWnd* pParentWnd) : CCommonDialog(pParentWnd)
{
memset(&m_ofn, 0, sizeof(m_ofn)); // initialize structure to 0/NULL
m_szFileName[0] = '\0';
m_szFileTitle[0] = '\0';
m_pofnTemp = NULL;
m_bOpenFileDialog = bOpenFileDialog;
m_nIDHelp = bOpenFileDialog ? AFX_IDD_FILEOPEN : AFX_IDD_FILESAVE;
m_ofn.lStructSize = sizeof(m_ofn);
m_ofn.lpstrFile = m_szFileName;
m_ofn.nMaxFile = _countof(m_szFileName);
m_ofn.lpstrDefExt = lpszDefExt;
m_ofn.lpstrFileTitle = (LPTSTR)m_szFileTitle;
m_ofn.nMaxFileTitle = _countof(m_szFileTitle);
m_ofn.Flags |= dwFlags | OFN_ENABLEHOOK | OFN_ENABLESIZING;
if (!afxData.bWin4 && AfxHelpEnabled())
m_ofn.Flags |= OFN_SHOWHELP;
if (afxData.bWin4)
{
m_ofn.Flags |= OFN_EXPLORER;
m_ofn.hInstance = AfxGetResourceHandle();
}
m_ofn.lpfnHook = (COMMDLGPROC)_AfxCommDlgProc;
// setup initial file name
if (lpszFileName != NULL)
lstrcpyn(m_szFileName, lpszFileName, _countof(m_szFileName));
// Translate filter into commdlg format (lots of \0)
if (lpszFilter != NULL)
{
m_strFilter = lpszFilter;
LPTSTR pch = m_strFilter.GetBuffer(0); // modify the buffer in place
// MFC delimits with '|' not '\0'
while ((pch = _tcschr(pch, '|')) != NULL)
*pch++ = '\0';
m_ofn.lpstrFilter = m_strFilter;
// do not call ReleaseBuffer() since the string contains '\0' characters
}
}
这个是CFileDialog 的构造函数,
可以看到:m_ofn.lStructSize = sizeof(m_ofn);
这个句话已经被编译在mfc42.dll里,也就是说,不管你定义没有定义#define _WIN32_WINNT 0x0501
它的大小都是一样大的,从MSDN可看到
typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;
这个条件编译很得要,会导致这个结构体大小不一样大
这就是为什么会崩溃的原因,一个大东西放入一个小空间里面绝对会溢出。
支持就顶一下,这个错误花了我三四个小时才找出来
#define _WIN32_WINNT 0x0501
因为我想用最新的函数,否则条件编译过不去,问题就出在这个宏定义上,为什么呢?
因为在
CFileDialog::CFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags,
LPCTSTR lpszFilter, CWnd* pParentWnd) : CCommonDialog(pParentWnd)
{
memset(&m_ofn, 0, sizeof(m_ofn)); // initialize structure to 0/NULL
m_szFileName[0] = '\0';
m_szFileTitle[0] = '\0';
m_pofnTemp = NULL;
m_bOpenFileDialog = bOpenFileDialog;
m_nIDHelp = bOpenFileDialog ? AFX_IDD_FILEOPEN : AFX_IDD_FILESAVE;
m_ofn.lStructSize = sizeof(m_ofn);
m_ofn.lpstrFile = m_szFileName;
m_ofn.nMaxFile = _countof(m_szFileName);
m_ofn.lpstrDefExt = lpszDefExt;
m_ofn.lpstrFileTitle = (LPTSTR)m_szFileTitle;
m_ofn.nMaxFileTitle = _countof(m_szFileTitle);
m_ofn.Flags |= dwFlags | OFN_ENABLEHOOK | OFN_ENABLESIZING;
if (!afxData.bWin4 && AfxHelpEnabled())
m_ofn.Flags |= OFN_SHOWHELP;
if (afxData.bWin4)
{
m_ofn.Flags |= OFN_EXPLORER;
m_ofn.hInstance = AfxGetResourceHandle();
}
m_ofn.lpfnHook = (COMMDLGPROC)_AfxCommDlgProc;
// setup initial file name
if (lpszFileName != NULL)
lstrcpyn(m_szFileName, lpszFileName, _countof(m_szFileName));
// Translate filter into commdlg format (lots of \0)
if (lpszFilter != NULL)
{
m_strFilter = lpszFilter;
LPTSTR pch = m_strFilter.GetBuffer(0); // modify the buffer in place
// MFC delimits with '|' not '\0'
while ((pch = _tcschr(pch, '|')) != NULL)
*pch++ = '\0';
m_ofn.lpstrFilter = m_strFilter;
// do not call ReleaseBuffer() since the string contains '\0' characters
}
}
这个是CFileDialog 的构造函数,
可以看到:m_ofn.lStructSize = sizeof(m_ofn);
这个句话已经被编译在mfc42.dll里,也就是说,不管你定义没有定义#define _WIN32_WINNT 0x0501
它的大小都是一样大的,从MSDN可看到
typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;
这个条件编译很得要,会导致这个结构体大小不一样大
这就是为什么会崩溃的原因,一个大东西放入一个小空间里面绝对会溢出。
支持就顶一下,这个错误花了我三四个小时才找出来
展开全部
打开文件没问题,应该是保存的时候出的错,你可以把保存文件的对话框打开的代码贴出来看看。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在我这边运行是没问题的,会不会是其它代码的问题?
可以试着新建一个新的对话框,里面就只放这段代码看看是不是其它代码的影响
新建一个对话框一试不就知道了
可以试着新建一个新的对话框,里面就只放这段代码看看是不是其它代码的影响
新建一个对话框一试不就知道了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询