Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > глобальная текущая директория


Автор: slavic 25.3.2007, 11:57
вопрос может быть и немного выходит за рамки раздела, но задам его здесь.

в с++ есть такое понятие как "текущая директория", ее можно получать и задавать функциями типа GetCurrentDir() и SetCurrentDir().

проблема возникла в следующем, есть 2 приложения, второе запускается сразу за первым. каким образом сделать так, чтобы 1ое (написаное на билдере, исходники его можно редактировать) в конце своей работы устанавливало "текущую директорию" , а 2ое (его пофиксить уже никак нельзя, оно вроде написано на делфях) - в котором есть стандартные вещи типа opendialog, считало initial directory как раз ту "текущую директорию", которую в конце своей работы установило 1ое приложение.

где копать? есть подозрения на реестр, но выжать из него ничего не смог..

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


PS. как показали практические исследования функция SetCurrentDir()работает только для текущего приложения. на второе она никак не влияет :(

Автор: Klin 25.3.2007, 13:20
Если я тебя правильно понял,  то тебе нужно, чтобы первое приложение определяло рабочию директорию второй программы. Тогда можно использовать глобальные переменные и прочее(об этом можешь почитать в FAQ). Но проще всего - этот либо файл, из которого будет браться эта директория, либо старый добрый реестр).
Код

#include <registry.hpp>

TRegistry *Reg = new TRegistry;
Reg->RootKey = HKEY_CURRENT_USER;

Reg->OpenKey("\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",true);  //Открываем ветвь
Reg->DeleteKey("\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"); //Удаляем ветьвь
Reg->WriteInteger("EditLevel", 1); //Записываем в неё целое число
Reg->WriteString("EditLevel", "111"); //Записываем в неё строку
Edit1->Text = Reg->ReadString("IPAddress");//Читаем из нее

Автор: slavic 25.3.2007, 13:44
Klin, насколько я понимаю не подойдет.

Так как код второго приложения я изменять не могу! (соответственно и передать ему ничего я не могу - если речь идет о параметрах, и сделать чтобы оно брало данные из реестра тоже не могу - ибо надо изменять код).

Но во втором приложении есть opendialog, у которого не прописана "инишиал директория". Посему и вопрос, откуда по умолчанию оно черпает инишиал директорию для opendialoga (например, какая то ячейка в реестре), хочется узнать это место и пистаь туда первым приложением нужную директорию.

Автор: W4FhLF 25.3.2007, 13:59
slavic, единственое, что здесь можно предложить - это перехват API в целевом приложении(а именно GetOpenFileName и правка управляющей структуры передаваемой параметром в эту функцию)

Автор: slavic 25.3.2007, 14:13
W4FhLF, а может вы мне поможете кодом, которым должно завершаться
1ое приложение, чтобы второе считало текущую директорию 1го своей текущей?

А то ваши объяснения для меня еще слишком суровы smile


Автор: W4FhLF 25.3.2007, 15:04
slavic, нет, помочь не могу, т.к. на Borland C++ я не пишу, но перехвату api материалов множество и эта тема регулярно обсуждается на форуме. 

Автор: Klin 25.3.2007, 22:15
Неплохая задачка smile
Могу сказать точно, что первая программа не должна закрываться перед второй. Первая в процессе выполнения программы должна перехватывать появление диалога открытия файла и менять путь. Или в компоненте аторой программы изменять этот путь. Есть API команды: GetCurrentDirectory и SetCurrentDirectory (о них можешь почитать в хелпе). Но на директорию OpenDialog они не влияют. Поэтому задачка не слишком быстро решается...

з.ы. опиши подробней вторую программу

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)