DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コモンダイアログが正しく表示されない

環境/言語:[Windows 7]
分類:[.NET]

特定のPCのみでコモンダイアログが正しく表示されません。
OpenFileDialogクラスを使った「ファイルを開く」ダイアログボックス、
SaveFileDialogクラスを使った「名前を付けて保存」ダイアログボックスが
添付画像のようになっています。
自分のPCやその特定のPC以外では問題なく表示されていますので、そのPCの問題だと思うのですが、原因がまったく分かりません。
同様の経験をされた方、あるいは原因をご存じの方がおられましたら、教えていただけないでしょうか。
よろしくお願い致します。

開発言語:VB2010
不具合が起きているPC:Windows 7 64bit版
添付ファイル: capture.jpg (73 KB)
この投稿はマルチポストです。

●マルチポストされている場所
http://bbs.wankuma.com/index.cgi?mode=al2&namber=66187

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html
2013/04/07(Sun) 21:12:19 編集(投稿者)
2013/04/07(Sun) 21:09:40 編集(投稿者)

> この投稿はマルチポストです。
>
> ●マルチポストされている場所
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=66187

誰かの嫌がらせでしょうか。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=66187
  ↑
私はこんな投稿はしていません。

http://imgur.com/iMGZ1UD&SeKQ9er
  ↑
こんなところに画像をアップした覚えもありません。
そもそも「http://imgur.com/」というサイトも知らないぐらいです。

マルチポストなんてしていませんので、よろしくお願い致します。

私が投稿したのではないので、
http://bbs.wankuma.com/index.cgi?mode=al2&namber=66187
この投稿を削除することも出来ません。

一体どういうことなのでしょうか。
そもそも私は「わんくま同盟」というサイトがあること自体、初めて知りました。
管理人さんの投稿で
「別の掲示板に投稿された内容をそのままこの掲示板に投稿するという、大変悪質ないたずらが多発しました。」
というのがありましたが、まさに今回は逆パターンの悪戯です。
この掲示板に私が投稿した内容をそのまま別の掲示板に投稿されたようです。
私は決してマルチポストなどしていませんので、信じていただくようお願い致します。
投稿内容に関して本当に困っています。
ご存じの方がおられましたら、回答いただくようお願い致します。
■No31446に返信(eboさんの記事)
> 添付画像のようになっています。

手元の Win7 で OpenFileDialog を使ってみました。
    using (var ofd = new OpenFileDialog())
    {
        ofd.Title = "ホームページデータのCSVファイルを選択してください";
        ofd.Filter = "CSVファイル(*.CSV)|*.CSV|すべてのファイル(*.*)|*.*";
        ofd.FileName = @"Z:\SAMPLE\TEST.CSV";   //存在しないドライブ
        //ofd.AutoUpgradeEnabled = false;
        ofd.ShowDialog();
    }

比べてみると、ファイル一覧が表示されない件だけでなく、
「ファイル名」「ファイルの種類」「OK」「キャンセル」の
ボックス位置が、通常と異なっているように思えます。

…比較画像を作ったのですが、スレッド内の添付領域が残り28KBしかなく、
画質が荒くなってしまいました。文章で説明すると、下記のような配置です。


私の環境(AutoUpgradeEnabled = false)
 ※左上システムメニューアイコン:有
   ファイル名    開く
   ファイルの種類  キャンセル


私の環境(AutoUpgradeEnabled = true):
 ※左上システムメニューアイコン:有
   ファイル名    ファイルの種類
            開く  キャンセル


問題の出ているeboさんの環境
 ※左上システムメニューアイコン:無し
   ファイル名    開く  キャンセル
   ファイルの種類


> 自分のPCやその特定のPC以外では問題なく表示されていますので、
正常に表示される他のPCにおいて、ファイルの種類ボックスや
ボタンの配置は、それぞれ一致していますか?

また、OpenFileDialog / SaveFileDialog を経由させていない
他のアプリケーションのダイアログ表示は正常ですか?

ダイアログを表示するだけの簡単な実験アプリを作成し、
そのビルドを x86ビルド/x64ビルド/AnyCPU ビルドの 3 種に
それぞれ変更した場合、EXE の実行結果には差異は生じますか?


> そのPCの問題だと思うのですが、原因がまったく分かりません。
類似画像検索も含めて探してみましたが、似たような事例が見当たりませんね。

ざっくり思いつくところでは…
・何らかのリソース不足により表示できなくなっている。
・ダイアログの表示、あるいはシェル名前空間をカスタマイズするタイプの
 ユーティリティソフトウェアや、セキュリティソフトが入っており、
 それが今回の問題を引き起こしている。
・コモンダイアログを乗っ取るタイプのトロイの木馬に汚染されている。
・システムコンポーネントの一部が DLL Hell を引き起こしている。
添付ファイル: capture3.jpg (28 KB)
魔界の仮面弁士さん
ありがとうございます。

ご呈示いただいた内容を確認してみます。
自分のPCではないので、なかなか確認しにくいのですが、
コモンダイアログが開くだけの簡単なアプリをx86ビルド/x64ビルド/AnyCPU ビルドの 3 種作って試してもらったところ、全て問題なく表示されたということです。

新たな情報として
1.画面を開いてコモンダイアログを開くボタンをクリックすると画像のようなコモンダイアログになる。
2.一度画面を閉じて、再度開いてボタンをクリックすると正常にコモンダイアログが表示される
3.再度画面を閉じて、また画面を開きボタンをクリックすると画像のようなコモンダイアログになり、キャンセルでコモンダイアログを閉じるとアプリが落ちる。

仮想メモリーを増やしてみても変化はありません。
3のアプリが落ちる件ですが、例外処理(Try〜Catch)でエラーがキャッチ出来ません。
UnhandledExceptionでもエラーがキャッチ出来ません。


システムコンポーネントの一部が DLL Hell を引き起こしているのでしょうか。
それを調べるにはどうしたらよいのでしょうか。

プログラミングとは関係ない内容かもしれませんが、教えていただけると幸いです。
よろしくお願い致します。
どのようにしてコモンダイアログを開いているか、例えばその部分のコードなどがあれば見せてもらえますか。
あるいは何のイベントでコモンダイアログを開いているか、など情報があるとありがたいです。
■No31470に返信(eboさんの記事)
> 全て問題なく表示されたということです。
AutoUpgradeEnabled プロパティの設定は、
未指定 / true / false のいずれでしょうか?


今回の現象が、IFileDialog 関連の環境トラブルだとしたら、
上記を false にすれば解決するかも知れません。
旧形式の表示となるため、見た目と操作感が変わってしまいますが…。


> 1.画面を開いてコモンダイアログを開くボタンをクリックすると画像のようなコモンダイアログになる。
> 2.一度画面を閉じて、再度開いてボタンをクリックすると正常にコモンダイアログが表示される
> 3.再度画面を閉じて、また画面を開きボタンをクリックすると画像のようなコモンダイアログになり、キャンセルでコモンダイアログを閉じるとアプリが落ちる。

上記は再現しておりませんが、少々気になる点がありました。

Windows 7 のコモンダイアログは、アプリを終了しても、
前回起動時のダイアログサイズを覚えているようですが、
そのリサイズ動作についてです。

まずは、ダイアログサイズを一番小さいサイズで覚えさせてから、
下記のコードを起動してみました。

  using (var ofd = new OpenFileDialog())
  {
      ofd.Title = "ホームページデータのCSVファイルを選択してください";
      ofd.Filter = "CSVファイル(*.CSV)|*.CSV|すべてのファイル(*.*)|*.*";
      ofd.FilterIndex = 0;
      ofd.FileName = @"SAMPLE.TXT";
      //ofd.InitialDirectory = "Shell:ProgramFiles";
      ofd.InitialDirectory = @"C:\Program Files\";
      ofd.ShowDialog();
  }

上記のように、InitialDirectory プロパティを設定しておいた場合、
ほんの一瞬だけ、ebo さんの最初の画像とサイズのダイアログが最初に表示され、
それがリサイズされて、本来のサイズで表示されるという動作が発生しました。

しかし No31458 のように、InitialDirectory を取得も設定もしなかった場合や、
InitialDirectory に null や "" を代入した場合には、同現象は再現しません。


なお、エクスプローラーの [ツール]-[フォルダーオプション]の設定は
下記のようにしています。関係ないかもしれませんけど。

 ナビゲーション ウィンドウ:
  ・すべてのフォルダーを表示する → OFF
  ・自動的に現在のフォルダーまで展開する → OFF


> 再度画面を閉じて、また画面を開き
デザイン時にダイアログをフォームに貼りつけ、それを使いまわす場合と、
利用するたびに「using (var ofd = new OpenFileDialog())」などで
生成と破棄を繰り返す場合とで、何か違いは生じますか?


> アプリが落ちる。
これは、アプリが無言で終了してしまうということでしょうか。
それとも、何かしらの致命的なエラー情報が、
画面あるいはイベントログなどに現れるのでしょうか。


どうしても解決できないようであれば、別の表示方法という事で、
IFileDialog インターフェイスを使うとか、
GetOpenFileNameW API で表示するなどといった、
アンマネージな表示方法を試してみては如何でしょう。
にゃわ様
お返事が遅くなり、大変申し訳ありませんでした。

> どのようにしてコモンダイアログを開いているか

Dim strCsvFile As String = ""
Try
  Dim ofd As New OpenFileDialog()
  ofd.Filter = "CSVファイル(*.csv)|*.csv"
  ofd.FilterIndex = 1
  ofd.Title = "ホームページデータのCSVファイルを選択してください"
  ofd.RestoreDirectory = True

  If ofd.ShowDialog() = DialogResult.OK Then
    strCsvFile = ofd.FileName
  End If
  If strCsvFile = "" Then
    Exit Sub
  End If
Catch ex As Exception
  MsgBox(ex.Message, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, cstrTitle)
  Exit Sub
End Try

(続きの処理)


> 何のイベントでコモンダイアログを開いているか

ボタンのクリックイベントです。
魔界の仮面弁士様
お返事が遅くなり、大変申し訳ありませんでした。

ご教授いただいた内容を確認してみます。
ありがとうございます。


> > アプリが落ちる。
> これは、アプリが無言で終了してしまうということでしょうか。
> それとも、何かしらの致命的なエラー情報が、
> 画面あるいはイベントログなどに現れるのでしょうか。

「○○は動作を停止しました。
 この問題の解決策を確認しています。」
というメッセージボックスが出るそうです。

イベントログは近くにいない方のPCなので、今現在確認してもらっていません。

取り敢えず、その方だけですので、暫定処理(エクスポートは保存先固定、インポートは画面にドラッグ&ドロップ)で対応していますので、
解決はしていませんが、一旦この件は解決にさせていただきます。

色々ご助言をいただきありがとうございました。

引き続き魔界の仮面弁士様のアドバイスに沿って検証しますので、
もし何か分かりましたら、投稿して共有させていただきます。


ありがとうござました。
解決済み!
■No31477に返信(eboさんの記事)

解決済みになっていますが、一応...
チェックはのこしておきます。


まるきり同じ現象ではないのですが、
「ファイルダイアログで発生」
「○○は動作を停止しました。この問題の〜」

のあたりが同じ症状に遭遇したことがあるので、
もしかしたら程度に書いてみます。

ebo さんのアプリが DB を使用していなければ、
たぶん関係ないのでスルーしてください。


私の場合、
・accdb (Access データベース) を使用している。
・DB にアクセスした後にダイアログを表示。
・Windows Update を行っていない。
場合に発生しました。
DB アクセスとダイアログ表示のタイミングは関係なさそうです。
それぞれの処理が別の画面でも発生しました。

本番機がネットワークに接続できない環境だったので、
Windows Update を行っていなかったため発生したようです。
# 2007 Office system ドライバ: データ接続コンポーネント は必要かも?
# 2007 Office system ドライバ 入れて WinUpdate しないと更に変になった...

一度 Update を行い、その後は安定しています。
たぶん Office 系 (?) の Update で解消したものと思います。

参考までに。
# たしか Win7 x86 環境だった気がします。
解決済み!
Ruku様
ありがとうございます。

その方のPCは買ったばかりの新しいPCで Win7 x86 です。

> ・accdb (Access データベース) を使用している。
はい

> ・DB にアクセスした後にダイアログを表示。
はい

> ・Windows Update を行っていない。
いいえ

ということで、Ruku様が経験されたケースと同じかもしれません。

OfficeのアップデートとWindowsのアップデートをやってみてもらいます。

ありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板