FolderBrowserDialogの問題?それとも・・・

タグの編集
投稿者 Adac  (社会人) 投稿日時 2016/12/17 18:08:34
Win7上でVisualBasic2013、.NET Framework 4.5で開発しています。^^;

フォルダ選択の必要があり、FolderBrowserDialogを使用したいのですが。

using dlg as new FolderBrowserDialog
    dlg.ShowDialog()
end using

のようなコードを書きました。
実行すると、ダイアログが表示されてフォルダを選択できます。
ここまでは問題はありません。

ダイアログでディスクが入っていない光学ドライブを指定すると
そのドライブがでてきて、ディスクを挿入してください。
と表示されます。
ここで、キャンセルをクリックしてメッセージボックスを閉じます。

そして、フォルダ選択ダイアログで選択してOKしても、キャンセル
しても、プログラムが「動作が終了しました」で終了してしまいます。

デバッグでもリリースでも、初期フォルダを設定等にも関係なく
発生します。

職場のPCだけではなく、自宅のWin10、VS2015でも発生しています。

この現象は私だけでしょうか?

また、Windows7のエクスプローラでも発生することがあります。
もしかして、私が知らないだけで有名な話なのでしょうか?
投稿者 YuO  (社会人) 投稿日時 2016/12/18 01:26:21
VS2015 on Windows 10で,Windows Formsアプリケーションのプロジェクトを作成し,
Button { Name = "Button1" }とLabel { Name = "Label1" }を作り,コードビハインドを
Option Compare Binary
Option Explicit On
Option Infer On
Option Strict On

Imports System
Imports System.Windows.Forms

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Using dlg As New FolderBrowserDialog
            If dlg.ShowDialog(Me) <> DialogResult.OK Then
                Exit Sub
            End If
            Label1.Text = dlg.SelectedPath
        End Using
    End Sub
End Class
として試してみましたが,例外は発生しませんでした。
実際に発生するコードを張るなりしてみてはどうでしょうか。

ぱっと思いつくのはShowDialogの戻り値を見ずにそのままディスクアクセスを実際に行ってIOExceptionが発生しているがそれをCatchしていない,というパターンですが,それであればVisual Studioが例外の未Catchを検出してダイアログを出すので,「動作が終了しました」などとはならないですしね……。
投稿者 Adac  (社会人) 投稿日時 2016/12/18 17:53:39
YuOさん、返事ありがとうございます。

提示いただいたソースでも自宅PCでは同様の状態です。

PC固有の問題であればよいのですが、すでに職場と自宅の
2台で発生するので、どうしたものかと思っています。

他のフォルダ選択用のコードも確認しようかと思っています。
投稿者 YuO  (社会人) 投稿日時 2016/12/19 03:04:35
そもそも,.NET Frameworkの例外すら発生せずに終了するのでしょうか。
そのような状況はあまり考えにくいのですが。

例外が発生しているのであれば,Visual Studioの例外アシスタントで例外の詳細をコピーしてここに貼り付けることで,もう少し情報が出てくるかもしれません。
少なくとも,強制終了するような場合には,イベントログのWindowsログ/Applicationに,レベル:エラー,ソース:Application Errorのようなイベントが記録されているはずですが……。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/12/19 09:56:56
> 職場のPCだけではなく、自宅のWin10、VS2015でも発生しています。
複数環境でテストしましたが、こちらの環境では再現しませんでした。

> この現象は私だけでしょうか?
> エクスプローラでも発生することがあります。
シェル拡張(Shell Extensions)の問題によって
この手の問題が引き起こされることがあります。
エクスプローラーでも発生するのなら、可能性は高いかと。

こうした問題の調査手順が下記に纏められていますので
参考にしてみては如何でしょうか。
その中の幾つかは既に実施済みかも知れませんが。
http://jihi4541.blog.fc2.com/blog-entry-4.html


ちなみに、上記のページの障害原因となっていた cymon.sys に関する情報はこちらです。
今回の事象とは異なるため、別の要因かも知れませんが、一応参考までに。
https://www.cyphertec.co.jp/news/cymon_revision.html
https://social.msdn.microsoft.com/Forums/ja-JP/d52ef8d8-e4a1-40f8-b7dc-17c80fcc3934/visual-studioos?forum=vsgeneralja
投稿者 Adac  (社会人) 投稿日時 2016/12/25 17:01:12
魔界の仮面弁士さん、情報をありがとうございます。

発生しているのが、ntdll.dllということはわかっているのですが、
発生しないマシンもあり、使用頻度が低い機能での問題なので
調査が先延ばしになっています。

いずれ何らかの対策が必要になると思われますが、マシンに
依存しているとなると、運用対処になるんじゃないかと思って
います。

いろいろありがとうございました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/12/27 15:48:08
> マシンに依存しているとなると、
FolderBrowserDialog を呼び出す際に、
MsgBox(System.Threading.Thread.CurrentThread.GetApartmentState().ToString())

を実行してみたとき、STA と表示されるかどうかを確認しておいてください。
通常は STA ですが、そうでない場合、FolderBrowserDialog を正しく呼び出せません。
PC によって異なる物では無いはずですが、念のため。


> 発生しているのが、ntdll.dllということはわかっているのですが、
先の Shell Extensions 問題の他、Office IME を Microsoft IME に
切り替えることで改善した例もあるそうです。

https://www.pcreview.co.uk/threads/error-when-using-folderbrowserdialog.1315092/
http://www.hori-tec.net/works/archives/2012/0929_230059.html
http://yoshida.blog.itsrv.net/archives/201.html