在 Visual Studio 2010 调试器中运行时不会显示 Windows 公用文件对话框
Posted
技术标签:
【中文标题】在 Visual Studio 2010 调试器中运行时不会显示 Windows 公用文件对话框【英文标题】:Windows Common File Dialog Will Not Display While Running in Visual Studio 2010 Debugger 【发布时间】:2013-06-06 04:31:52 【问题描述】:我有一个 VS2010 C++ 应用程序,它以非常普通的方式使用 Windows 通用文件对话框。我的公司刚刚将我的工作站更新为带有 Windows 7 的不错的四核 CPU,而我以前的系统仍在运行 XP。当我在 Visual Studio 调试器中运行我的应用程序时,任何调用 CFD 的尝试似乎都会以静默方式失败,代码不会向输出窗口抛出明显错误,也不会出现对话框。在调试器之外,一切正常。我每次都以几乎相同的方式调用对话框。
CString theFilterList = "CSV Import Files (*.csv)|*.csv";
theFilterList = theFilterList + "|All files (*.*)|*.*||";
// construct the common dialog
CFileDialog fileDlg(TRUE, NULL, NULL,OFN_ENABLESIZING | OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT, theFilterList,this);
POSITION pos;
// Initialize m_ofn structure
fileDlg.m_ofn.lpstrTitle = "Please select a UP supplied CSV file to prepare to load into SCT.";
// Create buffer for file names.
const DWORD bufferSize = (MAX_MULTISELECT_FILENAMES * MAX_FILENAMESIZE) + 1;
TCHAR* filenamesBuffer = new TCHAR[bufferSize];
// Initialize beginning and end of buffer.
filenamesBuffer[0] = NULL;
filenamesBuffer[bufferSize-1] = NULL;
// Attach buffer to OPENFILENAME member.
fileDlg.m_ofn.lpstrFile = filenamesBuffer;
fileDlg.m_ofn.nMaxFile = bufferSize;
if ( fileDlg.DoModal() != IDOK)
theCSVFilenameList.RemoveAll();
return;
pos = fileDlg.GetStartPosition();
while( pos )
theCSVFilenameList.Add(fileDlg.GetNextPathName( pos ));
【问题讨论】:
罗杰,在我看来没有愚蠢的问题,所以我很欣赏这个想法,即使不是这样。我很自豪(震惊;惊讶)说我从 Windows 1.1 开始就一直在为 Windows 编码(哦,太恐怖了)我的猜测是这种老派风格需要针对 Win 7+ 进行更新。我怀念技术人员运行 MS 而不是营销部门的日子。感谢您的意见。 那么,当您在调试器中执行fileDlg.DoModal()
行时,究竟会发生什么? DoModal
返回值是什么?它是立即返回还是挂起?
我只是稍微改变了我的代码,所以我可以看到值 - 它似乎立即返回 IDCANCEL 而没有首先显示对话框 ' /*if (fileDlg.DoModal() != IDOK) return; */ int iResult = fileDlg.DoModal();如果(iResult!= IDOK)返回;
调试环境中有一些东西会导致这种行为。您需要使用 MFC 源代码调试DoModal
。我在 Windows 7 中没有遇到这样的问题。
这些对话框可能会以难以诊断的方式失败,因为它们会将外壳扩展处理程序加载到您的进程中。您可以在“输出”窗口中轻松看到一些内容,它显示了一堆 DLL 的加载通知。一个行为不端的人可能会导致随机的麻烦。比如说,某种不喜欢看到附加调试器的 DRM 组件。运行 SysInternals 的 AutoRuns 实用程序并禁用任何没有 Microsoft 版权的 shell 扩展处理程序。使用二分搜索缩小麻烦制造者的范围。
【参考方案1】:
我刚遇到这个问题。我发现我的 StackReserve 大小太高了。我减少了它,对话框开始出现。尽管在我的情况下,它在调试器内外都发生了。
【讨论】:
以上是关于在 Visual Studio 2010 调试器中运行时不会显示 Windows 公用文件对话框的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 Windows XP 上使用 Visual Studio 2010 远程调试器从 Visual Studio 2012 调试 .Net 4.0 应用程序吗?
在 Visual Studio 2010 中调试时出现致命错误 HRESULT=0x80131c08
如何在 Visual Studio 2010 中关闭远程调试?