声明:该反馈主体为Qoder+Qwen3.8-Max撰写,bug和修复方案也是它找的。反馈内容经本人人工检查修改。
现象
Chrome 插件"Qoder 浏览器连接器"的侧边栏中,云端连接正常、当前标签页可连接,但本地客户端一行一直是"未发现客户端"。重启 Chrome、重载扩展均无效。
扩展 service worker 控制台报错:
Unchecked runtime.lastError: Error when communicating with the native messaging host.(对应com.qoder.app.connector)- 其余宿主名报
Specified native messaging host not found.(未注册,属预期)
环境
- Windows 11(build 26300),Chrome 153
- Qoder CN 0.2.5(桌面端)
- Qoder Browser Connector 1.7.4(Chrome Web Store 版)
- 宿主注册表键
HKCU\Software\Google\Chrome\NativeMessagingHosts\com.qoder.app.connector→ 清单%USERPROFILE%\.qoder\browser-connector\com.qoder.app.connector.json→path为qoder-app-connector-host.cmd
排查
| 启动方式 | 结果 |
|---|---|
| CreateProcess 直接启动 .cmd(分配控制台) | 正常,0.15s 返回协议帧 |
| 隐藏控制台窗口(SW_HIDE) | 正常 |
| 不分配控制台(CREATE_NO_WINDOW) | 0 输出、立即退出 |
同上方式跑 cmd /d /c echo HELLO(已禁用 AutoRun) |
同样 rc=1、无有效输出 |
绕过 .cmd,直接以 ELECTRON_RUN_AS_NODE=1 启动 Qoder CN.exe 执行 qoder-app-host.cjs,无控制台 |
正常,0.13–0.15s 返回 |
| 无控制台下经 .cmd 启动任意控制台程序(如 findstr) | 0 输出 |
同时排除的个体因素:cmd.exe AutoRun 钩子(conda)、系统代理(含 <local> 绕过)、杀毒/组策略(无 NativeMessaging 策略键)、清单与注册表本身(REG_SZ、无 BOM、allowed_origins 匹配)、心跳与 relay 端口(ws://127.0.0.1:<port>/extension/v2 握手 101 正常)。
bug来源
Chrome 在 Windows 上以不分配控制台的方式拉起原生消息宿主;而 cmd.exe 在无控制台且 stdio 重定向为管道时自身无法运行(连 echo 都执行不了)。Qoder 以 .cmd 批处理作为宿主入口,必须经 cmd.exe,因此宿主进程在 Chrome 里"被启动但一句话没说就退出",Chrome 报通信错误,扩展本地客户端列表持续为空。
建议修复
原生消息宿主入口不要使用 .cmd/.bat。改为一个 console 子系统的可执行文件 shim:设置 ELECTRON_RUN_AS_NODE=1 后直接创建主程序进程并继承 stdio、透传退出码(实测该方式在无控制台/隐藏控制台/有控制台三种方式下均正常)。
用户侧临时修复
- 用 .NET Framework 自带 csc 编译如下 shim(console 子系统):
using System; using System.Diagnostics; static class Shim { static int Main() { var psi = new ProcessStartInfo { FileName = @"<Qoder 安装目录>\Qoder CN.exe", Arguments = @"""<Qoder 安装目录>\resources\native-messaging-host\qoder-app-host.cjs""", UseShellExecute = false }; psi.EnvironmentVariables["ELECTRON_RUN_AS_NODE"] = "1"; using (var p = Process.Start(psi)) { p.WaitForExit(); return p.ExitCode; } } } - 将
com.qoder.app.connector.json的path改为该 shim(注册表无需改动)。 - 桌面端更新会重写该清单与 .cmd(本次排查中观察到重写行为),若之后的更新未修复该问题,我仍需重放第 2 步。
桌面端每次启动/更新会重写 %USERPROFILE%\.qoder\browser-connector\ 下的清单与启动器,任何用户侧修补都不持久,建议官方修复。