![设置 shell 扩展的代码页](https://linux22.com/image/1499190/%E8%AE%BE%E7%BD%AE%20shell%20%E6%89%A9%E5%B1%95%E7%9A%84%E4%BB%A3%E7%A0%81%E9%A1%B5.png)
我需要为 Windows 注册一个 Shell 扩展,它应该能够处理任何语言名称的文件和文件夹。
不幸的是,Windows 似乎通过命令提示符运行其 shell 扩展,因此参数不是以 Unicode 传输的,而是以命令提示符的代码页传输的,这几乎总是不好的。我知道 Windows 有一个 API 函数GetCommandLineW
,但由于所讨论的程序是用 Java 编写的,因此使用它需要笨重的 JNA/JNI 代码,而我正试图避免这种情况。
为整个操作系统设置默认代码页似乎不是一个可行的选择,因为我发现的唯一选项是设置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP
,据报道这会导致系统拒绝启动——这是一个大忌,因为我们正在谈论生产机器。
我尝试将 shell 扩展设置command
为类似
chcp 65001 & "C:\path\to\java\javaw.exe" -jar "C:\path\to\program\program.jar" "%1"
或有或没有的变化等%SystemRoot%
,> nul
但所有的结果都相同 - 执行 shell 扩展时,命令提示符窗口闪烁,但我的程序从未被调用。
下一步是创建一个简单的批处理文件:
chcp 65001
"C:\path\to\java\javaw.exe" -jar "C:\path\to\program\program.jar" "%1"
并将 shell 扩展命令更改为:
"C:\path\to\program\batch.bat" "%1"
但每当我尝试运行它时,我都会收到一条错误消息
系统无法从指定设备读取
这使我相信该参数在到达批处理文件之前已被 shell 扩展执行弄乱,此时无法保存。
所以我的问题是 - 运行 shell 扩展时,是否有一种合理的方法要求 Windows 以 Unicode(或任何其他代码页)传递参数?或者唯一的选择是使用 提供的本机 API GetCommandLineW
?