1

通常、CFileDialog を使用してファイルを複数回開くと、現在のディレクトリが維持されます。つまり、前のダイアログが終了したディレクトリでダイアログが開くたびに (キャンセルされていない場合)。これは、異なる場所から CFileDialog の異なるインスタンスを使用する場合でも機能します。

また、プログラムを再起動した後も、以前のディレクトリは維持されます。

しかし、私のアプリでは、これは DLL 全体では機能しないようです。メインの .exe プログラムから呼び出された CFileDialogs には現在のディレクトリがあり、.dll からの CFileDialogs には別のディレクトリがあります。それらは互いに相互作用しませんが、それ以外は「通常」に動作します。

そのため、現在のディレクトリが 2 つ矛盾しているため、DLL から必要な場所に再度移動する必要があります。また、ディレクトリを変更するのを忘れて、あるディレクトリから .exe にデータをロードし、別のディレクトリから .dll に他のデータをロードすると、奇妙な結果が得られることがあります。

.exe と .dll から CFileDialog を開くときに同じ現在のディレクトリを持つ方法を知っていますか?

明確化: ダイアログを常に同じディレクトリから開始するのではなく、最後に使用したディレクトリを保持したいのですが、.exe と .dll で一貫して実行します。

私の.exeはVS2003で作成され、.dllはVS2010で作成されます。

(私の最初の推測では、DLL の CFileDialog コンストラクターでメイン ウィンドウ ハンドルを提供する必要があるということでしたが、これは役に立ちませんでした。私の次の推測では、GetCurrentDirectory() を介して手動で現在のディレクトリを取得し、それを開始場所として設定します。 dll の CFileDialog (そして、現在のディレクトリを終了した場所に設定します。)しかし、これは非常に見苦しく、WinXP から Win8 までのすべての OS で動作するかどうかはわかりません。 .)

4

2 に答える 2

2

以下のように CFileDialog を使用する必要があります。

CFileDialog FileDlg( TRUE, NULL, NULL, OFN_NOCHANGEDIR, _T( "All Files (*.*)|*.*||" ));

フラグ OFN_NOCHANGEDIR は、ファイル ダイアログを開く際に以前のパスを保持することを示します。フィルターは一例です。ファイル拡張子には独自のフィルターを使用する必要があります。

exe と dll の両方で同じ場所を取得する必要がある場合は、両方で同じファイル ダイアログ オブジェクトを使用します。

于 2013-05-08T11:20:06.930 に答える