Текущий каталог CFileDialog несовместим с .exe и .dll

Обычно, когда вы используете CFileDialog, чтобы открыть файл несколько раз, текущий каталог сохраняется. То есть каждый раз, когда диалог открывается в каталоге, где заканчивался предыдущий диалог (если он не был отменен). И это работает, даже если вы используете разные экземпляры CFileDialog из разных мест.

И даже после перезапуска программы предыдущий каталог сохраняется.

Но, похоже, в моем приложении это не работает через DLL: CFileDialogs, вызываемый из основной программы .exe, имеет свой текущий каталог, а CFileDialogs из .dll — другой. Они не взаимодействуют друг с другом, но ведут себя «нормально».

Таким образом, я получаю две несовместимые текущие директории, и вам придется снова перейти в нужное место из DLL. И иногда вы забываете изменить каталог и загружаете некоторые данные в .exe из одного каталога, а некоторые другие данные в .dll из другого каталога и получаете странные результаты.

Знаете ли вы способ иметь тот же текущий каталог при открытии CFileDialog из .exe и .dll?

Пояснение: я не хочу, чтобы диалоги всегда начинались с одного и того же dir, я хочу, чтобы они сохраняли последний использованный dir, но делаем это последовательно в .exe и .dll.

Мой .exe создается в VS2003, .dll в VS2010.

(Моим первоначальным предположением было то, что вам нужно предоставить дескриптор главного окна в конструкторе CFileDialog в DLL, но это не помогло. Следующее мое предположение — вручную получить текущий каталог через, ну, в общем, GetCurrentDirectory () и установить его в качестве исходного местоположения для CFileDialog dll (а затем установить текущий каталог там, где он закончился). Но это выглядит довольно уродливо, и я не уверен, что он будет работать во всех ОС от WinXP до Win8, потому что у них разные правила для каталога по умолчанию CFileDialog в соответствии с MSDN .)

1

Решение

Вы должны использовать CFileDialog, как указано ниже:

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

Флаг OFN_NOCHANGEDIR указывает на сохранение предыдущего пути при открытии файла диалога.
Фильтр является лишь примером. Вы должны использовать свои собственные фильтры для расширений файлов.

Если вам нужно получить одно и то же местоположение в exe и dll, используйте один и тот же файл диалогового объекта в обоих.

2

Другие решения

Вам нужно установить lpstrInitialDir CFileDialog :: m_ofn member членская структура. По моему опыту, используемая папка по умолчанию также различается в зависимости от целевой операционной системы и настроек проводника.

1