Мне нужно зарегистрировать расширение Shell для Windows, которое должно обрабатывать файлы и папки с именами на любом языке.
К сожалению, похоже, что Windows запускает свои расширения оболочки через командную строку, и, таким образом, параметры передаются не в Unicode, а в кодовую страницу командной строки, что почти всегда плохо. Я знаю, что в Windows есть API-функция GetCommandLineW
, но поскольку рассматриваемая программа написана на Java, для ее использования потребуется неуклюжий код JNA/JNI, которого я стараюсь избегать.
Установка кодовой страницы по умолчанию для всей ОС, кажется, не является жизнеспособным вариантом, так как единственная найденная опция - установка HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP
, которая, как сообщается, может заставить систему отказаться от загрузки - большое нет-нет, поскольку мы говорим о производстве машин.
Я попытался установить для моей command
расширений оболочки что-то вроде
chcp 65001 & "C:\path\to\java\javaw.exe" -jar "C:\path\to\program\program.jar" "%1"
или варианты с или без %SystemRoot%
, > nul
и т. д., но все они приводят к одному и тому же - при выполнении расширения оболочки окно командной строки мигает, но моя программа никогда не вызывается.
Следующим шагом было создание простого командного файла:
chcp 65001
"C:\path\to\java\javaw.exe" -jar "C:\path\to\program\program.jar" "%1"
и изменив команду расширения оболочки на:
"C:\path\to\program\batch.bat" "%1"
Но всякий раз, когда я пытался запустить это, я получал сообщение об ошибке
Системе не удалось прочитать с указанного устройства
Это заставляет меня поверить, что параметр был искажен выполнением расширения оболочки до достижения командного файла, и в этот момент его нельзя было сохранить.
Итак, мой вопрос - есть ли разумный способ попросить Windows передавать аргументы в Юникоде (или любой другой кодовой странице) при запуске расширения оболочки? Или это единственный вариант использования нативного API, предоставляемого GetCommandLineW
?