0

この問題と 1 日半戦っていますが、答えが見つかりません。保存ダイアログを開くためのコードを次の単純なコードに減らしました。

CFileDialog dlg( FALSE, _T("xml"), _T("zzz.xml"), 
    OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR,
        _T("XML Files|*.xml||"), this);

dlg.m_ofn.lpstrInitialDir = ... a string for the initial directory
dlg.DoModal();

CFileDialog クラス (これも GetSaveFileName を直接使用するだけで検証済み) は、選択されたディレクトリへのハンドルを保持していますが、これは明らかに Windows XP (私たちの展開プラットフォーム) でのみです。これにより、アプリケーションの実行中にディレクトリの名前を変更できなくなります。

現在のディレクトリを設定する CFileDialog について誰かが話し始める前に、私はそれについて知っており、OFN_NOCHANGEDIR について知っています。これはその問題ではありません。

このコードをループで実行すると、保持されるハンドルの数が増加し、Process Explorer を使用してアプリケーションがそのディレクトリへのハンドルを持っていることを確認できます。ダイアログを繰り返し実行すると、追加のハンドルが発生しますが、常にではありません。毎回名前を変更すると、100%一貫してではありませんが、毎回新しい名前が追加されるようです。

それを回避する何かがあると思うたびに、うまくいきません。ファイル ダイアログのような基本的なものが、どうしてこんなに壊れているのでしょうか?

他に何をすべきかわかりません。これは、新しいバージョンをリリースする直前に発見された問題です。

4

2 に答える 2

2

MFC の CFileDialog と基礎となる Windows API が長い間存在していることを考えると、私の最初の反応は、明らかにハンドルをリークしているバグがあるのではないかと疑うことです。したがって、あなたが見ている問題は別のものから来ていると思います。

ファイル ダイアログについての 1 つのことは、シェル拡張をロードすることです。たとえば、Windows エクスプローラーに表示されるさまざまなサードパーティの右クリック機能は、独自のプログラムで呼び出すファイル ダイアログでも使用できます。シェル拡張機能の動作が適切であれば問題ありませんが、そうでないものもあります。したがって、これをテストしたシステムには、ファイルダイアログで使用されたときにハンドルがリークする、不適切に記述されたシェル拡張がインストールされている可能性があります。

ファイルダイアログによってロードされたこれらの余分なコンポーネントがソフトウェアの他の部分に問題を引き起こしたケースを見たことがありますが、すべての人が同じものをインストールしているわけではないため、特定の人のコンピューターでのみ発生しました。

もちろん、これが実際にあなたの問題であると言うのに十分な情報はありません. 私はアイデアを提供し、同様にセットアップされていない別の Windows XP コンピュータでこの問題をテストすることを提案することしかできません。他のものをインストールする前に、Windows XP の完全な新規インストールでテストすることもできます。一部のコンピューターで問題が発生しない場合は、サードパーティ コンポーネントに問題があることを示しています。

于 2012-09-22T01:23:15.427 に答える
0

私は犯人が何であるかを発見しました。問題のアプリケーションはあまりよく書かれておらず、メインの UI スレッドで長時間実行されるタスクを頻繁に実行しています。物理デバイスを制御する同じマシン上で実行される他のコードもあります。他のコードで発生した問題の 1 つは、問題のアプリケーションによって保留され、停止することでした。残念ながら、別の問題を解決するために、ハイパースレッディングをオフにする必要がありました。これにより、2 つが共存できるようになります。

そのため、2 つのアプリケーションを共存させ、このアプリケーションよりもマシン制御プログラムの優先順位を高くするために、アプリケーションのスレッドの優先順位が最も低い優先順位に下げられました。

このスレッド優先度の低下が原因であることが判明しました。だから、バンドエイドの上に別のバンドエイドを置くために、バンドエイドの上に。ファイル ダイアログのスレッドの優先順位を上げ、戻るときに下げる CFileDialog サブクラスを作成します。

于 2012-09-24T19:45:08.423 に答える