Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Найти путь к папке плагина

 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
black_cat



Joined: 10 Feb 2017
Posts: 2

Post (Separately) Posted: Fri Feb 10, 2017 21:51    Post subject: Найти путь к папке плагина Reply with quote

В общем пишу маленький плагин.
По сути первый.
Появилась необходимость загрузки настроек из ini-файла. Предполагается, что он должен лежать в той же папке, что и сам плагин.
А вот как корректно узнать путь к этой папке из самого плагина, что-то не пойму.
Спасибо.

Добавлено спустя 2 часа 17 минут:

Извиняюсь. Поторопился. Разобрался.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Sat Feb 11, 2017 00:34    Post subject: Reply with quote

Решение, думаю, привести будет не лишним, т.к. кому-нибудь ещё это тоже может понадобиться.

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

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

Общий способ получения пути к папке любого модуля лежит через получение пути к самому модулю с помощью функции GetModuleFileName, но если для экзешника достаточно передать туда NULL (0), для DLL надо передавать туда hinstDLL, который передаётся в функцию DllMain.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
remittor



Joined: 21 Oct 2019
Posts: 19
Location: Russia

Post (Separately) Posted: Tue Nov 12, 2019 22:35    Post subject: Reply with quote

MVV wrote:
...он сообщается в поле DefaultIniName структуры, передаваемой...

Ну если я китаец, который установил TC в папку c:\users\用戶名\...
что в этом случае вернёт ТС через этот аргумент?


MVV wrote:
...через получение пути к самому модулю с помощью функции GetModuleFileName ...

Снова представим, что я китаец.
Получаем UTF-16 путь через GetModuleFileNameW.
А вот дальше то что?
Использовать функцию GetPrivateProfileStringW? Но тогда нужно ini-файл перекодировать в UTF-16.

Китайцы не жаловались на "отвал" плагинов?
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Wed Nov 13, 2019 01:31    Post subject: Reply with quote

remittor wrote:
Ну если я китаец, который установил TC в папку c:\users\用戶名\...
что в этом случае вернёт ТС через этот аргумент?

У китайца, скорее всего, выбрана китайская локаль. Так что там вернётся та же строка в соответствующей кодировке. Гораздо интереснее, что будет, если китаец установит Тотал в папку C:\Программы\… Но таких китайцев, я подозреваю, очень немного.
Хотя да, с точки зрения Тотала это недоработка. С другой стороны, нет необходимости пользоваться именно ListSetDefaultParams. Есть ещё переменная COMMANDER_INI, из которой можно вычленить каталог расположения INI-файлов.

remittor wrote:
Снова представим, что я китаец.
Получаем UTF-16 путь через GetModuleFileNameW.
А вот дальше то что?
Использовать функцию GetPrivateProfileStringW? Но тогда нужно ini-файл перекодировать в UTF-16.

Ну, во-первых, лично я ничего плохого в UTF-16 в INI-файлах не вижу. Во-вторых, если уж мы все из себя интернациональные, то в любом случае будет глупо ограничиваться поддержкой Юникода исключительно в путях, а содержимое INI при этом держать в кодировке ANSI. А если нам потом понадобится туда какой-то путь записать? Или какую-то другую строку, потенциально содержащую международные символы? Лучше озаботиться этим заранее, чем потом патчить плагин и переконвертировать существующие INI у пользователей.

А на самом деле, даже SetPrivateProfileStringW по умолчанию создаёт INI в кодировке ANSI (по крайней мере, у меня получилось именно так), и для Юникода нужно заранее озаботиться созданием этого файла в нужной кодировке.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Wed Nov 13, 2019 09:33    Post subject: Reply with quote

Что недоработка, согласен, для юникодных версий плагинов следовало сделать эти поля структуры юникодными, или хотя бы считать, что там UTF-8 (но для UTF-8 строки всё равно надо больше места, чем MAX_PATH байт).

Все версии функций для работы с INI прекрасно определяют кодировку файла (ANSI или Unicode) и при необходимости перекодируют данные, т.е. функция GetPrivateProfileStringA так же спокойно читает файл в Unicode, как и функция GetPrivateProfileStringW читает файл в ANSI, то же самое касается и функций записи, как заметил CaptainFlint. Другое дело, что для получения действительно юникодных строк (т.е. строк, содержащих символы, отсутствующие в системной кодовой странице) необходима комбинация файла в Unicode и юникодных версий функций.

Мне кажется, в крайнем случае стоит пытаться использовать конфигурационный файл в папке плагина, а если его там нет - в той же папке, где лежит wincmd.ini (читать %COMMANDER_INI%). Это будет явно лучше, чем хранить настройки в реестре.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group