6

ファイルを開くダイアログを表示しようとすると、次の ArgumentException がスローされているフィールドにデプロイされている WPF アプリケーションからレポートを取得しています。

Exception Message:   Value does not fall within the expected range.
Method Information:  MS.Internal.AppModel.IShellItem2 GetShellItemForPath(System.String)
Exception Source:    PresentationFramework
Stack Trace
  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.FileDialog.RunDialog(IntPtr hwndOwner)
  at Microsoft.Win32.CommonDialog.ShowDialog(Window owner)
  ...

問題は、これまで開発環境でこれを再現できなかったことですが、この例外が発生しているというレポートを現場からいくつか受け取りました。

誰もこれを見たことがありますか?そして最も重要なことは、単純に try/catch を配置して、ユーザーが何をしようとしているのかを再試行するように指示する以外に、その原因や修正を知っていますか?

コメントに応答して、これはダイアログを開くコードです (いいえ、戻り値の型をチェックする問題ではありませんでした)。ShowDialog 内から例外がスローされます (スタック トレースを参照)。

Nullable<bool> result = null;

var dlg = new Microsoft.Win32.OpenFileDialog();
dlg.DefaultExt = ".txt";
dlg.Filter = "Text Files (.txt)|*.txt|All Files|*.*";
dlg.Title = "Open File";
dlg.Multiselect = false;
dlg.InitialDirectory = GetFolderFromConfig("folders.templates");
result = dlg.ShowDialog(Window.GetWindow(this));

if (result == true)
{
    // Invokes another method here..
}
4

3 に答える 3

7

この問題は、マップされたネットワーク ドライブなど、特殊でないディレクトリでも発生する可能性があります。私の場合、%HOME%環境変数はマップされたネットワーク ドライブ (Z:) を指しています。したがって、次のコードは同じ例外を生成します。

Nullable<bool> result = null;

var dlg = new Microsoft.Win32.OpenFileDialog();
dlg.DefaultExt = ".txt";
dlg.Filter = "Text Files (.txt)|*.txt|All Files|*.*";
dlg.Title = "Open File";
dlg.Multiselect = false;
dlg.InitialDirectory = Environment.GetEnvironmentVariable("Home")+@"\.ssh"; // boom
result = dlg.ShowDialog(Window.GetWindow(this));

解決:

var dlg = new Microsoft.Win32.OpenFileDialog();
dlg.DefaultExt = ".txt";
dlg.Filter = "Text Files (.txt)|*.txt|All Files|*.*";
dlg.Title = "Open File";
dlg.Multiselect = false;
dlg.InitialDirectory = System.IO.Path.GetFullPath(Environment.GetEnvironmentVariable("Home")+@"\.ssh"); // no boom
result = dlg.ShowDialog(Window.GetWindow(this));
于 2013-09-23T18:30:01.377 に答える
3

彼が私を正しい方向に向けてくれたので、これは本当に@Hans Passantに行くべきです。

問題が実際に何であるかを理解すると、開発用コンピューターで問題を複製 (および修正) するのは簡単であることがわかりました。この問題は、実際に InitialDirectory プロパティが奇妙な値に設定されていたことが判明しました。私の場合、InitialDirectory を "\" に設定することで問題を再現できました。

この問題に対処するために変更されたコードは次のとおりです。

 try
 {
     result = dlg.ShowDialog(Window.GetWindow(this));
 }
 catch{
     dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer);
     result = dlg.ShowDialog(Window.GetWindow(this));
 }
于 2013-01-07T23:08:54.333 に答える