View previous topic :: View next topic |
Author |
Message |
black_cat
Joined: 10 Feb 2017 Posts: 2
|
(Separately) Posted: Fri Feb 10, 2017 21:51 Post subject: Найти путь к папке плагина |
|
|
В общем пишу маленький плагин.
По сути первый.
Появилась необходимость загрузки настроек из ini-файла. Предполагается, что он должен лежать в той же папке, что и сам плагин.
А вот как корректно узнать путь к этой папке из самого плагина, что-то не пойму.
Спасибо.
Добавлено спустя 2 часа 17 минут:
Извиняюсь. Поторопился. Разобрался. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
MVV
![](images/avatars/7418103424d805f0e7526c.gif)
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Sat Feb 11, 2017 00:34 Post subject: |
|
|
Решение, думаю, привести будет не лишним, т.к. кому-нибудь ещё это тоже может понадобиться.
Вообще, по умолчанию лучше хранить настройки в файлах конфигурации, которые предлагает сам тотал при инициализации плагина (листер-плагинам он сообщается в поле DefaultIniName структуры, передаваемой в функцию ListSetDefaultParams).
Но т.к. многие предпочитают хранить настройики плагинов в папках самих плагинов, опционально можно хранить их там (я в своих плагинах использую файлы конфигурации в папках плагинов, если эти файлы существуют).
Общий способ получения пути к папке любого модуля лежит через получение пути к самому модулю с помощью функции GetModuleFileName, но если для экзешника достаточно передать туда NULL (0), для DLL надо передавать туда hinstDLL, который передаётся в функцию DllMain. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
remittor
Joined: 21 Oct 2019 Posts: 19 Location: Russia
|
(Separately) Posted: Tue Nov 12, 2019 22:35 Post subject: |
|
|
MVV wrote: | ...он сообщается в поле DefaultIniName структуры, передаваемой... |
Ну если я китаец, который установил TC в папку c:\users\用戶名\...
что в этом случае вернёт ТС через этот аргумент?
MVV wrote: | ...через получение пути к самому модулю с помощью функции GetModuleFileName ... |
Снова представим, что я китаец.
Получаем UTF-16 путь через GetModuleFileNameW.
А вот дальше то что?
Использовать функцию GetPrivateProfileStringW? Но тогда нужно ini-файл перекодировать в UTF-16.
Китайцы не жаловались на "отвал" плагинов? |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
CaptainFlint
![](images/avatars/1538602816566b383536f19.png)
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Wed Nov 13, 2019 01:31 Post subject: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
MVV
![](images/avatars/7418103424d805f0e7526c.gif)
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Wed Nov 13, 2019 09:33 Post subject: |
|
|
Что недоработка, согласен, для юникодных версий плагинов следовало сделать эти поля структуры юникодными, или хотя бы считать, что там 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 |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|