Page 1 of 3

Вопрос по пути ;)

Posted: Wed May 24, 2006 9:40 pm
by rabid rabbit
Как можно в Колибри получить путь к файлу запущенного процесса?
Т.е. запустили программу /HD0/1/TEMP/PROGA, и эта программа путём некоторых действий получила строку ASCIIZ "/HD0/1/TEMP/PROGA"

Posted: Wed May 24, 2006 10:07 pm
by Serge
Похоже что никак. Когда запускается новое приложение программе передается имя файла, а путь отсекается :(

Posted: Wed May 24, 2006 10:15 pm
by andrew_programmer
Как-то можно.Марат реализовал эту возможность(это было несколько дистрибутивов назад).
А вот как ей пользоваться - я непонял.

Posted: Thu May 25, 2006 6:58 am
by mike.dld
Serge wrote:программе передается имя файла, а путь отсекается
Кто это тебе сказал такую глупость? Есть баг, что при запуске программ 19-й функцией (и другими, которые требуют только имя файла для запуска) передаётся только имя файла. В случае же запуска программы 58-й функцией программе передаётся полный путь.

Для того, чтобы получить путь к самому себе, нужно в заголовке в поле I_ICON (следующее за I_PARAM) поместить адрес буфера достаточной длины. Какова "достаточная длина" не знает никто, так что предлагаю принять её равной, допустим, 4096. Многовато, но уж точно не мало. При запуске программы ядро запишет в буфер по этому адресу путь к программе именно в том виде, который тебе нужен, т.е. полный путь + имя файла.

Posted: Thu May 25, 2006 12:03 pm
by rabid rabbit
Да, типа сахар в холодильнике в банке с этикеткой "сметана" ;) Никогда бы не догадался, что поле I_ICON отвечает за путь к выполняемому файлу процесса ;) А нафига тогда I_PARAM нужен?

Posted: Thu May 25, 2006 4:45 pm
by mike.dld
I_ICON задумывался для хранения адреса иконки приложения. Идея в жизнь так и не воплотилась, но название осталось. Называй I_APPPARAM, например, если тебе так больше нравится.
I_PARAM содержит адрес буфера для параметров, переданных приложению при запуске.

Posted: Thu May 25, 2006 5:30 pm
by Mario79
rabid rabbit
Все как описывает mike.dld, но размер буфера может изменяться от 12*2+2 (например, db '/hd0/1/',0 - возвращается в растянутом виде, где каждое звено между косюшками занимает 11 байт, вместе со всеми пробелами) до очень большого значения.
Надо будет в документацию добавить информацию по этому поводу, чтобы люди не путались.
И еще возврат пути реализован только для заголовка MENUET01
Вот, пожалуй, и все.

Posted: Thu May 25, 2006 6:41 pm
by rabid rabbit
а почему-бы не помещать путь к программе в качестве первого параметра?

Posted: Thu May 25, 2006 9:42 pm
by Mario79
rabid rabbit
Потому что так уже сложилось "исторически" и уже есть одно серьезное приложение, которое использует данный параметр, это Тинипад который написал mike.dld
И к тому же перестановка слагаемых суммы не меняет, нет видимых причин просто так менять код, никаких неудобств я в таком положении вещей не вижу, но готов выслушать твои выводы, если таковые имеются.

Posted: Thu May 25, 2006 10:33 pm
by rabid rabbit
ну, например MHTPACK (так вроде, который исполняемые файлы упаковывает) принципиально не хочет паковать прогу, у которой I_ICON != 0. Хотя, может он и от проги с I_PARAM !=0 откажется, я не проверял.

Posted: Fri May 26, 2006 11:46 am
by diamond
mtappack не пакует программы, использующие путь, поскольку для поддержки этого при распаковке нужен дополнительный код. Программы, использующие параметры, он упаковывает. Все остальные упаковщики, по-моему, просто игнорируют это поле, что приводит к неправильной работе...
Между прочим, что делать в 70-й функции для (будущей) соответствующей подфункции запуска? Там-то нет ограничений 8.3...

Posted: Fri May 26, 2006 1:42 pm
by Serge
Надо хранит путь и рабочий каталог в памяти ядра. Увеличить размер структур по 0x80000 и записывать их туда.

Posted: Fri May 26, 2006 1:43 pm
by diamond
Но память ядра приложению недоступна!?

Posted: Fri May 26, 2006 5:24 pm
by Mario79
rabid rabbit
Это проблема приложений, а не проблема ядра. Она вполне решаема переписыванием упаковщиков, а вот сложившиеся вещи в ядре трогать лишний раз не стоит, без крайней необходимости.

diamond
А все также - возвращаешь путь, а в первом байте указываешь ASCII или UNICODE данные.

Serge
Зачем занимать память ядра? Ядру ведь нет дела до того, откуда загружено приложение. Приложение само должно знать и хранить свой путь, так как он требуется именно для приложения.
К тому же опять писать лишние и практически бессмысленные функции. Но это ИМХО.

Posted: Fri May 26, 2006 7:43 pm
by Serge
Зачем занимать память ядра? Ядру ведь нет дела до того, откуда загружено приложение. Приложение само должно знать и хранить свой путь, так как он требуется именно для приложения.
К тому же опять писать лишние и практически бессмысленные функции. Но это ИМХО.
Правильно. Давайте хранить все программы и данные в корневом каталоге загрузочного диска :) Похоже, что путь "../data/my_save.dat" вызовет у файловой системы полуобморочное состояние. Рано или поздно все равно придется делать GetCurrentDir/SetCurrentDir или жить с рамдиском без папок, "как завещал великий Вилле" :)
Сам он с этого пути уже свалил.