diff --git a/openless-all/app/src-tauri/installer.nsh b/openless-all/app/src-tauri/installer.nsh index cefbcea6..e6675c39 100644 --- a/openless-all/app/src-tauri/installer.nsh +++ b/openless-all/app/src-tauri/installer.nsh @@ -14,14 +14,21 @@ ; 必须同时注册 x64 + x86 两份 dll:windows_ime_profile.rs 的 ; inspect_windows_ime_registration() 会用 KEY_WOW64_64KEY 和 KEY_WOW64_32KEY 两次 ; 检查 HKLM CLSID InprocServer32,少了任何一边都会被判 RegistrationBroken。 -; - x64 用 $SYSDIR\regsvr32.exe (System32 = 64-bit on x64 Windows) -; - x86 用 $WINDIR\SysWOW64\regsvr32.exe (32-bit regsvr32 → 写 KEY_WOW64_32KEY) +; +; ⚠️ NSIS installer 自身是 32-bit 进程,会触发 WOW64 文件系统重定向: +; - 32-bit 进程里的 $SYSDIR / $WINDIR\System32 都被重定向到 $WINDIR\SysWOW64, +; 运行的是 32-bit regsvr32 → 注册结果落在 HKLM\Software\Wow6432Node(即 +; KEY_WOW64_32KEY 视图),Rust 端 KEY_WOW64_64KEY 查不到 → 仍判"不可用"。 +; - 32-bit 进程访问真正的 64-bit System32 必须走 $WINDIR\Sysnative 这个 alias。 +; 因此: +; - x64 dll → $WINDIR\Sysnative\regsvr32.exe → 写 KEY_WOW64_64KEY 视图 +; - x86 dll → $WINDIR\SysWOW64\regsvr32.exe → 写 KEY_WOW64_32KEY 视图 ; ; regsvr32 失败时不阻塞安装:用户仍可以靠 SendInput / 粘贴兜底完成上屏。 !macro NSIS_HOOK_POSTINSTALL DetailPrint "Registering OpenLess TSF IME (x64) ..." - nsExec::ExecToLog '"$SYSDIR\regsvr32.exe" /s "$INSTDIR\tsf-ime\x64\OpenLessIme.dll"' + nsExec::ExecToLog '"$WINDIR\Sysnative\regsvr32.exe" /s "$INSTDIR\tsf-ime\x64\OpenLessIme.dll"' Pop $0 ${If} $0 != 0 DetailPrint "OpenLess TSF IME x64 registration failed (exit $0); fallback insertion paths still work." @@ -40,6 +47,6 @@ nsExec::ExecToLog '"$WINDIR\SysWOW64\regsvr32.exe" /s /u "$INSTDIR\tsf-ime\x86\OpenLessIme.dll"' Pop $0 DetailPrint "Unregistering OpenLess TSF IME (x64) ..." - nsExec::ExecToLog '"$SYSDIR\regsvr32.exe" /s /u "$INSTDIR\tsf-ime\x64\OpenLessIme.dll"' + nsExec::ExecToLog '"$WINDIR\Sysnative\regsvr32.exe" /s /u "$INSTDIR\tsf-ime\x64\OpenLessIme.dll"' Pop $0 !macroend