diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index 830e51bf6e7d1bfda805f17dcd0937e1fb1f44d8..de5cbca646aa47caf2e37b836adcb57c3016e240 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -79,15 +79,22 @@ impl CoreManager { pub async fn run_core(&self) -> Result<()> { let config_path = Config::generate_file(ConfigType::Run)?; - let should_kill = match self.sidecar.lock().take() { + let mut should_kill = match self.sidecar.lock().take() { Some(child) => { - log::debug!(target: "app", "stop the core sidecar"); + log::debug!(target: "app", "stop the core by sidecar"); let _ = child.kill(); true } None => false, }; + #[cfg(target_os = "windows")] + if *self.use_service_mode.lock() { + log::debug!(target: "app", "stop the core by service"); + log_err!(super::win_service::stop_core_by_service().await); + should_kill = true; + } + // 这里得ç‰ä¸€ä¼šå„¿ if should_kill { sleep(Duration::from_millis(500)).await; @@ -98,10 +105,8 @@ impl CoreManager { use super::win_service; // æœåŠ¡æ¨¡å¼ - let enable = { - let enable = Config::verge().data().enable_service_mode.clone(); - enable.unwrap_or(false) - }; + let enable = { Config::verge().latest().enable_service_mode.clone() }; + let enable = enable.unwrap_or(false); *self.use_service_mode.lock() = enable; @@ -189,7 +194,7 @@ impl CoreManager { pub fn stop_core(&self) -> Result<()> { #[cfg(target_os = "windows")] if *self.use_service_mode.lock() { - log::debug!(target: "app", "stop core by service"); + log::debug!(target: "app", "stop the core by service"); tauri::async_runtime::block_on(async move { log_err!(super::win_service::stop_core_by_service().await); }); @@ -198,6 +203,7 @@ impl CoreManager { let mut sidecar = self.sidecar.lock(); if let Some(child) = sidecar.take() { + log::debug!(target: "app", "stop the core by sidecar"); let _ = child.kill(); } Ok(()) diff --git a/src-tauri/src/core/win_service.rs b/src-tauri/src/core/win_service.rs index 16cf70cb533fb5de4390201a5e3fc52625e92ecf..865895b2082f83e97a6a88eb966a7a73f048babc 100644 --- a/src-tauri/src/core/win_service.rs +++ b/src-tauri/src/core/win_service.rs @@ -44,7 +44,7 @@ pub async fn install_service() -> Result<()> { let level = token.privilege_level()?; let status = match level { - PrivilegeLevel::NotPrivileged => RunasCommand::new(install_path).status()?, + PrivilegeLevel::NotPrivileged => RunasCommand::new(install_path).show(false).status()?, _ => StdCommand::new(install_path) .creation_flags(0x08000000) .status()?, @@ -74,7 +74,7 @@ pub async fn uninstall_service() -> Result<()> { let level = token.privilege_level()?; let status = match level { - PrivilegeLevel::NotPrivileged => RunasCommand::new(uninstall_path).status()?, + PrivilegeLevel::NotPrivileged => RunasCommand::new(uninstall_path).show(false).status()?, _ => StdCommand::new(uninstall_path) .creation_flags(0x08000000) .status()?, diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 4fc7be9a1e3558f7156bb66965b3aff30023f0de..f6a11270a01e3d528d2c3f96f168636a482374c4 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -212,6 +212,8 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { let service_mode = patch.enable_service_mode; if service_mode.is_some() { + log::debug!(target: "app", "change service mode to {}", service_mode.unwrap()); + Config::generate()?; CoreManager::global().run_core().await?; } else if tun_mode.is_some() { diff --git a/src/components/setting/mods/service-viewer.tsx b/src/components/setting/mods/service-viewer.tsx index 2f9c3caf809c3bf94a23acb1ed67f1ee280da198..2bfbeb01912ec570f0e78016cc10d17cea6d4e0a 100644 --- a/src/components/setting/mods/service-viewer.tsx +++ b/src/components/setting/mods/service-viewer.tsx @@ -48,7 +48,7 @@ export const ServiceViewer = forwardRef<DialogRef, Props>((props, ref) => { const onUninstall = useLockFn(async () => { try { - if (state === "active" && enable) { + if (enable) { await patchVergeConfig({ enable_service_mode: false }); }