在 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 挂起附加到进程/调试

在 Visual Studio 2010 中调试时出现致命错误 HRESULT=0x80131c08

如何在 Visual Studio 2010 中关闭远程调试?

在本地运行/调试时如何使用 Visual Studio 2010 配置转换?

Visual Studio 2012 与 Visual Studio 2010 (delta) [关闭]