chdir программно

В Windows — и, возможно, в Unix — использование функции chdir() в (32-разрядной) программе не меняет каталог при выходе из программы. (Это происходит в 16-разрядной программе Windows.)
Кто-нибудь знает, как это сделать в 32-разрядной программе Windows?


person Community    schedule 12.03.2010    source источник
comment
Вещи, необходимые, чтобы сделать этот вопрос лучше: о каком языке вы говорите? Перл? С? Что-то другое? Во-вторых, если у вас есть код для демонстрации вашей проблемы, это значительно увеличит шансы получить хороший ответ на ваш вопрос.   -  person JasCav    schedule 12.03.2010
comment
Могу я спросить, почему вы хотите это сделать? Возможно, есть другие способы достижения вашей цели без необходимости изменения рабочего каталога оболочки Windows?   -  person Andreas Rejbrand    schedule 12.03.2010


Ответы (4)


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

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

Насколько я знаю, cmd.exe Windows не имеет такого механизма. На самом деле, используя методы внедрения кода (например, CreateRemoteThread) в родительском процессе, можно было бы заставить его делать что-то неожиданное, но это очень грязный трюк, не совсем хороший и не общий. Win16 была другой: было одно состояние msdos для всех программ, но это было ограничением, а не фичей.

person Giuseppe Guerrini    schedule 12.03.2010
comment
Чтобы добавить: системный вызов chdir изменяет каталог вызывающего процесса. Это означает, что вы не можете изменять каталоги других процессов по замыслу. - person Avindra Goolcharan; 24.02.2021

Похоже, вы просите один процесс (вашу программу Win32) изменить CWD другого процесса (вашей оболочки). Насколько мне известно, это невозможно без предоставления последним процессом API для такой цели. Однако ближайшая ссылка на это утверждение, которую я могу найти, это следующая цитата: из MSDN:

Родительский процесс может напрямую изменять переменные среды дочернего процесса во время создания процесса. Это единственная ситуация, когда процесс может напрямую изменить параметры среды другого процесса.

person ladenedge    schedule 12.03.2010

Ну да, это правда, что популярные вызовы API для изменения каталога меняют его для процесса. ... НО ...

(1.) 16-разрядные программы Windows могут изменять глобальный каталог; вероятно, потому что они работают в том же процессе, что и command.com. Это то, чем я с удовольствием пользуюсь годами; Я предполагаю, что XP каким-то образом эмулирует это? ... Но теперь 64-разрядная версия Windows 7 больше не будет запускать 16-разрядные программы! (?)

(2.) И Windows, и Unix-команды "cd", конечно, могут менять каталоги для вызывающего процесса - предположительно потому, что они являются встроенными командами командной оболочки. Но последующим оболочкам Windows это удается, или, по крайней мере, я надеюсь, PowerShell может это сделать. Все встроенные?

(3.) То, как я это сделал, модифицирует мои программы, которые раньше вызывали API, чтобы просто выдать «cd \dst\directory» на стандартный вывод, а затем в процедуре do

chdirprogram >t~.bat

позвонить T~.bat

Который отлично работает. И, конечно же, обычная цель программы изменения каталога — предоставить функциональность в пакетной процедуре с вычисляемым пунктом назначения. Что, конечно, вы можете сделать в Unix с переменными Bash и т. Д., Но не в пакетных файлах Windows, хотя, возможно (?) В многочисленных последовательных процедурах Windows, которые я не хочу использовать. ... Поскольку эта функциональность очевидно полезна, я надеялся, что кто-нибудь знает о скрытом вызове Windows, что это сделает. Объяснение того, что процесс как-то неправильно меняет каталог для вызывающего процесса, является одним из тех фиктивных оправданий типа "вы не должны этого делать, и я не скажу вам, почему". ... Но, думаю, я просто останусь со своими жалкими пакетными файлами.

person Community    schedule 15.03.2010

Вы говорите о функции Windows SetCurrentDirectory? API? В статье сказано, что функция "меняет текущий каталог для текущего процесса". Например, в Delphi есть функция ChDir, которая фактически вызывает эту функцию API.

person Andreas Rejbrand    schedule 12.03.2010