chdir программно - PullRequest
       17

chdir программно

2 голосов
/ 12 марта 2010

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

Ответы [ 4 ]

6 голосов
/ 12 марта 2010

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

3 голосов
/ 12 марта 2010

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

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

2 голосов
/ 15 марта 2010

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

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

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

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

chdirprogram> t ~ .bat

звоните T ~ .bat

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

0 голосов
/ 12 марта 2010

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

...