Мне нужно зарегистрировать расширение 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?

0