Установить кодовую страницу для расширения оболочки

328
Itai

Мне нужно зарегистрировать расширение 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 передавать аргументы в Unicode (или любой другой кодовой странице) при запуске расширения оболочки? Или это единственный вариант использования нативного API GetCommandLineW?

0
`" C: \ path \ to \ java \ javaw.exe "-jar" C: \ path \ to \ program \ program.jar ""% ~ 1 "` в вашем пакете. Примечание `"% ~ 1 "`. Добавьте `echo% 1` после` chcp` и добавьте `pause` в конце скрипта. JosefZ 8 лет назад 1
Я не смог добиться лучших результатов с "% ~ 1" и в итоге использовал JNA для вызова нативного API ... Itai 8 лет назад 0
`chcp` изменяет кодовую страницу, используемую консолью. Предположительно, это также относится к тому, как консоль передает аргументы командной строки. Очевидно, консоль не передает аргументы в Unicode, так как я получал знаки вопроса вместо любых символов, не относящихся к ASCII. Itai 8 лет назад 0
Пожалуйста, включите `echo ON` и добавьте` echo "% CD%": "% ~ f0" = "% ~ 1" & pause` к вашему пакетному хвосту. Затем [отредактируйте] свой вопрос и результаты `copy` &` paste` из открытого окна `cmd`. JosefZ 8 лет назад 0

0 ответов на вопрос