diff --git a/desktop/package.json b/desktop/package.json index 7eb8288..a88b255 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -25,7 +25,29 @@ }, "files": [ "src/**/*", - "package.json" + "package.json", + { + "from": "node_modules", + "to": "node_modules", + "filter": [ + "electron-updater/**/*", + "builder-util-runtime/**/*", + "debug/**/*", + "ms/**/*", + "sax/**/*", + "js-yaml/**/*", + "argparse/**/*", + "lazy-val/**/*", + "lodash.escaperegexp/**/*", + "lodash.isequal/**/*", + "tiny-typed-emitter/**/*", + "fs-extra/**/*", + "graceful-fs/**/*", + "jsonfile/**/*", + "universalify/**/*", + "semver/**/*" + ] + } ], "extraResources": [ { diff --git a/desktop/src/main.cjs b/desktop/src/main.cjs index 6a0ed2c..0ed4605 100644 --- a/desktop/src/main.cjs +++ b/desktop/src/main.cjs @@ -8,7 +8,13 @@ const { dialog, shell, } = require("electron"); -const { autoUpdater } = require("electron-updater"); +let autoUpdater = null; +let autoUpdaterLoadError = null; +try { + ({ autoUpdater } = require("electron-updater")); +} catch (err) { + autoUpdaterLoadError = err; +} const { spawn, spawnSync } = require("child_process"); const fs = require("fs"); const http = require("http"); @@ -297,6 +303,12 @@ function isAutoUpdateEnabled() { const forced = parseEnvBool(process.env.AUTO_UPDATE_ENABLED); let enabled = forced != null ? forced : !!app.isPackaged; + if (enabled && !autoUpdater) { + enabled = false; + logMain( + `[main] auto-update disabled: electron-updater unavailable: ${autoUpdaterLoadError?.message || "unknown error"}` + ); + } // In packaged builds electron-updater reads update config from app-update.yml. // If missing, treat auto-update as disabled to avoid noisy errors. @@ -823,6 +835,10 @@ function getPackagedBackendPath() { return path.join(process.resourcesPath, "backend", "wechat-backend.exe"); } +function getPackagedWcdbDllPath() { + return path.join(process.resourcesPath, "backend", "native", "wcdb_api.dll"); +} + function startBackend() { if (backendProc) return backendProc; @@ -853,8 +869,17 @@ function startBackend() { `Packaged backend not found: ${backendExe}. Build it into desktop/resources/backend/wechat-backend.exe` ); } + const packagedWcdbDll = getPackagedWcdbDllPath(); + if (fs.existsSync(packagedWcdbDll)) { + env.WECHAT_TOOL_WCDB_API_DLL_PATH = packagedWcdbDll; + logMain(`[main] using packaged wcdb_api.dll: ${packagedWcdbDll}`); + } else { + logMain(`[main] packaged wcdb_api.dll not found: ${packagedWcdbDll}`); + } + + const backendCwd = path.dirname(backendExe); backendProc = spawn(backendExe, [], { - cwd: env.WECHAT_TOOL_DATA_DIR, + cwd: backendCwd, env, stdio: ["ignore", "pipe", "pipe"], windowsHide: true, diff --git a/src/wechat_decrypt_tool/wcdb_realtime.py b/src/wechat_decrypt_tool/wcdb_realtime.py index a875033..4cbd53f 100644 --- a/src/wechat_decrypt_tool/wcdb_realtime.py +++ b/src/wechat_decrypt_tool/wcdb_realtime.py @@ -253,7 +253,9 @@ def _ensure_initialized() -> None: return rc = int(lib.wcdb_init()) if rc != 0: - raise WCDBRealtimeError(f"wcdb_init failed: {rc}") + logs = get_native_logs(require_initialized=False) + hint = f" logs={logs[:6]}" if logs else "" + raise WCDBRealtimeError(f"wcdb_init failed: {rc}.{hint}") _initialized = True @@ -315,11 +317,12 @@ def _call_out_error(fn, *args) -> None: pass -def get_native_logs() -> list[str]: - try: - _ensure_initialized() - except Exception: - return [] +def get_native_logs(*, require_initialized: bool = True) -> list[str]: + if require_initialized: + try: + _ensure_initialized() + except Exception: + return [] lib = _load_wcdb_lib() out = ctypes.c_char_p() rc = int(lib.wcdb_get_logs(ctypes.byref(out)))