调试使用Vista API中的FileDialog的Visual Studio 2010解决方案时出现问题

我有一个WinForms C#Visual Studio 2008(.NET 3.5)解决方案,将升级到Visual Studio 2010(.NET保持在3.5版本)。 此解决方案使用Vista API中的FileDialog有两个原因:

  1. 在Windows XP中运行应用程序时,期望为用户提供Windows XP外观文件对话框。 在Windows Vista和7中运行相同的应用程序时,文件对话框将具有Vista外观。
  2. 更重要的是,我们的应用程序允许用户打开项目文件,该文件可以是本地文件(存储在用户的计算机上或USB设备上),也可以是服务器项目(托管在MS SQL Server中)。 为此,我们使用Vista API,因为我们可以访问文件类型下拉列表控件的事件处理程序。 因此,实现是这样的,向用户呈现打开文件对话框,当他们从文件类型下拉列表中选择“服务器”选项时,打开文件对话框关闭,并打开另一个对话框,允许用户选择他们希望连接的服务器和服务器项目。

在Visual Studio 2008中调试应用程序时,Vista API没有问题。 当解决方案升级到Visual Studio 2010(在Windows 7中运行)时,用户尝试调试应用程序,并且用户希望访问Vista API打开文件对话框,应用程序崩溃并抛出ArgumentException,并显示以下消息: “价值不在预期范围内”。 当用户在没有调试(Ctrl + F5)的情况下从Visual Studio 2010运行解决方案时,没有exception发生。 “违规”代码是:

internal void DoFolderChange(IFileDialog dialog) { IShellItem ppsi = null; string ppszName = string.Empty; dialog.GetFolder(out ppsi); // Exception occurs here ppsi.GetDisplayName(NativeMethods.SIGDN.SIGDN_FILESYSPATH, out ppszName); OnFolderChange(ppszName); } 

我尝试了一些谷歌搜索,但无济于事。 我有一个带有Vista API的示例Visual Studio 2010解决方案,此问题也出现在此解决方案中。 可以从此处下载示例项目(以ZIP格式)。 要重现此问题:

  1. 在Visual Studio 2010中调试解决方案。
  2. 启动“Vista Api演示”后,单击“对话框”选项卡。
  3. 从位于“对话框”选项卡右侧的“Vista外观”列中,单击“打开文件”按钮。
  4. 将出现一个消息“文件类型已更改为1”的对话框。 单击“确定”按钮。
  5. 观察到此时应用程序崩溃,clsFileDialog.cs中的DoFolderChange(IFileDialog)方法抛出exception。

我为这篇冗长的post道歉,但我需要解释为什么需要Vista API文件对话框实现的整个背景。 我非常感谢您解决此问题的任何帮助,因为我的开发团队正在考虑使用Visual Studio 2010,并且我们开发人员不希望摆弄附加和分离调试器以绕过此问题。

我遇到了这个,我在我的案例中找到了解决办法。

原始代码:

 OpenFileDialog fdlg = new OpenFileDialog(); string tempDirectoryName = @"..\SomeFolder\"; /* Note, the use of a relative directory*/ fdlg.InitialDirectory = tempDirectoryName ; Nullable result = fdlg.ShowDialog(); 

然后我把它改成:

 OpenFileDialog fdlg = new OpenFileDialog(); string tempDirectoryName = @"..\SomeFolder\"; /* Note, the use of a relative directory*/ string massagedDirectoryName = System.IO.Path.**GetFullPath**(tempDirectoryName); fdlg.InitialDirectory = massagedDirectoryName; /*Note, this is now the full folder name */ Nullable result = fdlg.ShowDialog(); 

它不再轰炸我了。

我的情况几乎相同。

我的情景:

代码是VS2008下的WPF应用程序并且工作正常。 (3.5框架是目标框架)我向代码转换为VS2010(4.0 Framework是目标框架)。 然后出现了这个新问题。

这两个代码库都运行在Windows 7 x64上。

………….

我的完整错误是:

  Value does not fall within the expected range. at MS.Internal.Interop.HRESULT.ThrowIfFailed(String message) at MS.Internal.AppModel.ShellUtil.GetShellItemForPath(String path) at Microsoft.Win32.FileDialog.PrepareVistaDialog(IFileDialog dialog) at Microsoft.Win32.FileDialog.RunVistaDialog(IntPtr hwndOwner) at Microsoft.Win32.CommonDialog.ShowDialog()