Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


Guest
Цитата:
Спасибо за ответ
Не за что. В смысле, ответ-то неправильный, причем совсем. Итак, по порядку.

Для каждого процесса есть установленный текущий каталог. Этот каталог, естественно, можно прочитать, сменить и так далее, но обычно сами процессы этим не балуются. Есть набольшие исключения, например, у процесса может не быть текущего каталога по умлочанию и хэндл на него может быть не открыт (см. ниже про PEB). Такие процессы существуют и нормально работают, по всей видимости, запрос текущего каталога для них лмбо обламывается, либо возвращает системый, большего придумать сложно. Но сталкиваться с такими процессами, уверяю, Вам придется ой как нечасто, если вообще придется (хотя, мой TaskEx, если ему указано запускаться под системной учетной записью, запускается с неоткрытым текущим каталогом, да и сам может показать, у кого какой текущий каталог, строка запуска и т.п.). А пока надо запомнить, что у каждого процесса есть свой каталог по умолчанию, абсолютно любой, лишь бы он существовал.

На NT-системах это подтверждается форматом PEB (Process Environment Block - блок окружения процесса). За этим отсылаю на свой сайт http://zw.nightmail.ru, где есть краткое описание, что такое TEB и PEB, а также их структура (в описании структур). Обратить внимание надо на PROCESS_PARAMETERS, ссылка на это есть в PEB, так вот, в параметрах процесса хранятся ОТДЕЛЬНЫЕ величины для
а) имени запускаемого образа,
б) текущего каталога,
в)командной строки (обращаю внимание, это полная командная строка, то есть, вообще говоря, в командной строке имя запускаемого файла иожет отсутствовать, она вообще может отсутствовать, как это ни странно)
г) пути поиска файлов (в этот путь в коде kernel32.dll насильно добавляется текущий каталог, но в общем случае его там тоже может не быть, как, например, в UNIX-системах из-за соображений безопасности)

В принципе, чтоб понять, что это все такое и как оно устроено, надо поглядеть структуру PEB и дочерних структур, и посмотреть TaskEx-ом эти параметры для запущенных в системе процессов и загруженные в них модули.

Для проводника переход в другой каталог НЕ приводит к изменению текущего каталога, он просто читает данные из другого каталога, и все. Так что заявления, что трудно оставаться в одном каталоге, мне напоминают заявления о шаловливых ручках, "куда б мне тыкнуться в проводнике"? Да и вообще, в одном процессе проводника может быть несколько окон, отображающих файлы и папки, тут уж явно никакой текущий каталог не поможет.

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

Это все безусловно верно для всех NT-систем.
Для 9x - это немного не так, в плане структур и различных тонкостей в случае имени файла и командной строки, но все равно, текущий каталог устанавливается для процесса, а не для окна, он может быть сменен, но не меняется.

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 17:31, 30-01-2003 | #4