gpt4 book ai didi

c# - 调试使用来自 Vista API 的 FileDialog 的 Visual Studio 2010 解决方案的问题

转载 作者:太空宇宙 更新时间:2023-11-03 16:47:32 25 4
gpt4 key购买 nike

我有一个 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 并显示以下消息: “值(value)不在预期范围内”。奇怪的是,当用户在没有调试 (Ctrl + F5) 的情况下从 Visual Studio 2010 运行解决方案时,没有发生异常。 “违规”代码是:

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 解决方案,该问题也出现在该解决方案中。可以从 here 下载示例项目(ZIP 格式) .要重现问题:

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

对于冗长的帖子,我深表歉意,但我需要解释为什么需要 Vista API 文件对话框实现的整个背景。感谢任何帮助解决此问题的帮助,因为我的开发团队正在考虑使用 Visual Studio 2010,我们开发人员不希望为了绕过此问题而摆弄附加和分离调试器。

最佳答案

我遇到了这个问题,并找到了解决方法。

原始代码:

OpenFileDialog fdlg = new OpenFileDialog();
string tempDirectoryName = @"..\SomeFolder\"; /* Note, the use of a relative directory*/
fdlg.InitialDirectory = tempDirectoryName ;
Nullable<bool> 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<bool> result = fdlg.ShowDialog();

它不再轰炸我了。

我的情况几乎相同。

我的场景:

代码是 VS2008 下的 WPF 应用程序并且可以运行。 (3.5 框架是目标框架)我向上转换为 VS2010 的代码(4.0 框架是目标框架)。然后出现了这个新问题。

两个代码库都在 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()

关于c# - 调试使用来自 Vista API 的 FileDialog 的 Visual Studio 2010 解决方案的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5385619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com