[ Статья ] Находим местоположение WINCMD.INI

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Gosha
Сообщения: 11
Зарегистрирован: Ср фев 02, 2005 11:06

Сообщение Gosha »

SAM
Определить на 100%, где находятся эти файлы нельзя изначально!!!
Приведу несколько примеров, которые это продемонстрируют.
1. Записываем в [HKEY_CURRENT_USER\Software\Ghisler\Total Commander] IniFileName=
(пустую строку). TC при этом ни чего не говоря запускается, но ни какого ini файла не создает, а следовательно и найти его нет ни какой возможности.
2. Запишем в этот же ключ недопустимое имя файла, т.е. в имени которого присутсвую не допустимые для имени файла символы. TC при этом весело запускается, но опять ни какого ini файла не создает, а следовательно см. п1.

Тоже происходит если использовать
кривые имена файлов
в качестве параметров в командной строке.
TSergey
Сообщения: 49
Зарегистрирован: Пн янв 24, 2005 12:22

Сообщение TSergey »

Gosha, с таким подходом можно дойти до стояния: Windows полностью глюкавый и вообще не работает.
Или в качестве INI-файла подсунут файл свопа.
Продолжать можно бесконечно.

Если есть возможность программно узнать имя файла, то никакие оправдания не могут прикрыть лень программиста.
Аватара пользователя
mozers
Сообщения: 82
Зарегистрирован: Чт дек 16, 2004 13:14
Откуда: с Нижнего
Контактная информация:

Сообщение mozers »

Gosha
ОК. Давайте исключим из рассмотрения те варианты, при которых сам ТС нормально работать не может.
Что это за работа, если при любом изменении настроек от выдает "Error: Cannot write ! Please remove the write protection!"?

TSergey
никакие оправдания не могут прикрыть лень программиста
Суров ты :twisted:
TSergey
Сообщения: 49
Зарегистрирован: Пн янв 24, 2005 12:22

Сообщение TSergey »

SAM писал(а):TSergey
никакие оправдания не могут прикрыть лень программиста
Суров ты :twisted:
Дык. Я сам такой же: лентяй еще тот.
Вообще программисты - это самые продвинутые лентяи. Ну кто еще, из-за того, что ему лень раз в день нажать кнопочку, напишет программу, которая будет делать это за него? :twisted:
Gosha
Сообщения: 11
Зарегистрирован: Ср фев 02, 2005 11:06

Сообщение Gosha »

Тогды можно предложить следующию схему (актуальна, как для пог так и для плугинов)

1. Во время запуска определяем родительский процесс на принадлежность к TC (т.е. из TC ли нас запустили). По наличию %commander_path% определять не рекомендуется (особенно для плугинов)
1.1. Если да, то вытягивает командную строку и парсим ее
1.1.1 Пропарсили удачно и INI файл найден, то заканчиваем поиск.
1.1.2 В параметрах командной строки файла нет, тогда пытаемся искать стандартным образом (HKCU,HKLM,%windir%\wincmd.ini,сохраненные настройки)
1.1.2.1 Поиск прошел удачно. Заканчиваем процесс.
1.1.2.2 Неудачно. Предлагаем пользователю показать файл самостоятельно и заканчиваем поиск с любым результатом.
1.2. Если нет пытаемся стандартным образом определить местоположение (HKCU,HKLM,%windir%\wincmd.ini,сохраненные настройки)
1.2.1 Поиск прошел успешно. Заканчиваем.
1.2.2 Если неудачно, то предлагаем запустить прогу из под TC.

2. Если все таки файл так и найден, можно предложить поиск простым перебором всех INI файлов в системе. (т.е. Поиск файла по диску)
Gosha
Сообщения: 11
Зарегистрирован: Ср фев 02, 2005 11:06

Сообщение Gosha »

А теперь к делу.
Кто нить знает, как извлечь командную строку любого процесса, а то кроме создания дочернего потока в голову пока ни чего не приходит.
Аватара пользователя
Nik
Сообщения: 583
Зарегистрирован: Сб янв 01, 2005 13:00
Откуда: Киров
Контактная информация:

Сообщение Nik »

SAM писал(а):
Nik
Лишь путь :( А имя?

Эта функция предназначена для ini-файлов плагинов, поэтому возвращает строку: путь_к_файлу_настройки\имя_плагина.
Как я уже говорил, если убрать имя и вставить вместо него wincmd.ini, то получится полный путь... Если имя wincmd.ini изменено, то такой вариант не подойдет...
TSergey
Сообщения: 49
Зарегистрирован: Пн янв 24, 2005 12:22

Сообщение TSergey »

Из радостей значений в реестре.
Не знаю кому пришло в голову так делать (точнее: догадываюсь, но не понимаю за что?): в реестре значения

Код: Выделить всё

[HKEY_CURRENT_USER\Software\Ghisler\Total Commander]
"IniFileName"=".\wincmd.ini"
"FtpIniName"=".\wcx_ftp.ini"
означают ничто иное, как:

Код: Выделить всё

[HKEY_CURRENT_USER\Software\Ghisler\Total Commander]
"IniFileName"="%COMMANDER_PATH%\wincmd.ini"
"FtpIniName"="%COMMANDER_PATH%\wcx_ftp.ini"
Сама по себе запись .\wcx_ftp.ini означает взять файл в текущем каталоге, но ТС это понимает по своему.

ЗЫ. Изменил код в своем сообщении http://forum.wincmd.ru/viewtopic.php?p=1780#1780
Аватара пользователя
mozers
Сообщения: 82
Зарегистрирован: Чт дек 16, 2004 13:14
Откуда: с Нижнего
Контактная информация:

Сообщение mozers »

TSergey
Точка в пути - это лишь один из многочисленных вариантов...
Все вы ребята - умные и проблему решаете самым трудным способом.
А я уже говорил о великом множестве ньюансов... И все их надо учесть...
А мы - по простому ;) Немного через одно место. Но... работает всегда правильно :)
http://total.altruistic.ru/files/GetTotalINI.zip
(спасибо Shura за дельные коррективы)
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

TSergey писал(а):Из радостей значений в реестре.
Не знаю кому пришло в голову так делать (точнее: догадываюсь, но не понимаю за что?):
Эта фича появилась с версии 4.54 (16.07.01), когда переменная %COMMANDER_PATH% еще не существовала (та была введена только в версии 6.0 (17.11.03)).
Сама по себе запись .\wcx_ftp.ini означает взять файл в текущем каталоге, но ТС это понимает по своему.
А какой, собственно, каталог является текущим для командера при его запуске? Да свой же, родимый :lol: По крайней мере именно из него он по-дефолту грузит необходимые библиотеки и другое свое файло (totalcmd.inc, иконки, библиотеки архиваторов, описание панелей инструментов и пр.).
TSergey
Сообщения: 49
Зарегистрирован: Пн янв 24, 2005 12:22

Сообщение TSergey »

Volniy писал(а):А какой, собственно, каталог является текущим для командера при его запуске?
Тот, который я укажу в ярлыке, а не:
Volniy писал(а):Да свой же, родимый :lol:

ЗЫ. Со времен появления МелкоМагка нелюблю программы, которые считают себя умнее пользователя.
vserd
Сообщения: 118
Зарегистрирован: Вт апр 26, 2005 16:54

Сообщение vserd »

А какой, собственно, каталог является текущим для командера при его запуске?

Тот, который я укажу в ярлыке, а не:

Да свой же, родимый
Если в ярлыке запуска указаны полные пути к INI, тогда, берет из них как и ожидается. А если нет, тогда из %CommanderPath% в не зависимости от указания текущей директории.

Пример 1:
Создаем ярлык на рабочем столе.
Прописываем ему командную строку C:\TC\Totalcmd.exe /i=.\dir1\my.ini, в качестве рабочей директории ставим D:\ запускаем коммандер, смотрим на пути: C:\TC\dir1\my.ini.

пример 2:
Создаем ярлык на рабочем столе.
Прописываем ему командную строку C:\TC\Totalcmd.exe /i=..\dir1\my.ini, в качестве рабочей директории ставим D:\1\ запускаем коммандер, смотрим на пути: ..\dir1\my.ini.

Так что можно заявлять как о баге, но лучше не нужно. Пока нет нормального программного интерфейса к этим пременным, пускай будет такое определение чем "правильное".

Давайте Кристиана попробуем порасспрашивать на эту тему. Особенно когда передается относительный путь из ярлыка? Кто может грамотно написать на английском текст с проблемой? (у меня только чтение по английскому, писать не могу, и на слух не воспринимаю :((( )
Аватара пользователя
Nik
Сообщения: 583
Зарегистрирован: Сб янв 01, 2005 13:00
Откуда: Киров
Контактная информация:

Сообщение Nik »

А может попросить Гислера - пусть внедрит в плагинный интерфейс функцию для определения путь к ini-файлу? Это дело-то на пару минут...
Аватара пользователя
mozers
Сообщения: 82
Зарегистрирован: Чт дек 16, 2004 13:14
Откуда: с Нижнего
Контактная информация:

Сообщение mozers »

2Nik
Насколько я знаю, Гислер пообещал (еще до выхода 6.53) сделать пару переменных $MAININI и $FTPINI.
Но как известно - обещанного три года ждут :(
Аватара пользователя
mozers
Сообщения: 82
Зарегистрирован: Чт дек 16, 2004 13:14
Откуда: с Нижнего
Контактная информация:

Сообщение mozers »

Уже известный вам архивчик дополнился примером на Delphi (автор - Vladimir Serdyuk)
Алгоритм тот же - путь к файлам INI извлекается из появляющегося на мгновение окна About.
Рекомендуется все таки записать найденнные пути куда нибудь (лучше - в качестве относительных) чтобы не дергать то и дело дракона за хвост ;)
Ответить