手记

让electron-app支持带参数的命令行调用

1、目标效果

第三方软件可通过执行Windows CMD 命令的形式调用并传参给electron-app,命令格式如下:

// 指令示例
   x.exe --param=eyLlkbXlkbUiOiAi5L2g5aW95aWH5b+D5aW96YeN5ZWKIn0=
// 参数说明
   x.exe   :app的可执行文件名,app在安装时会将安装目录写入系统环境变量以便第三方软件可直接通过文件名唤醒app。
   --param :命令传参的参数名,app会根据该参数来进行后续操作,前面的“--”用于区分参数名。
   eyLlkbXlkbUiOiAi5L2g5aW95aWH5b+D5aW96YeN5ZWKIn0= :这是经过base64加密过的一条JSON数据,加密前的JSON数据为参数内容。

2、参数获取

在程序代码中需要对传参进行接收和处理,接收的方式主要有以下几种:

  • 方案一(推荐)

直接在渲染进程中读取this.$electron.remote.process.argv

  • 方案二

在主进程中设置共享数据集,供其与渲染进程之间交互之用。
主进程:global.sharedObject = {argv: process.argv}
渲染进程:require(‘electron’).remote.getGlobal(‘sharedObject’).argv

  • 方案三

使用ipcMain和ipcRenderer的“事件的发起&监听”实现主进程和渲染进程之间进行交互传参(略)。

3、打包配置

工具:NSIS
修改NSIS的配置文件*.nsi,在安装成功和卸载成功后对“系统环境变量/Path/项目安装目录”做增删操作。

# 安装成功以后.
Function .onInstSuccess
  ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
  WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;$INSTDIR"
  SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment"
FunctionEnd

# 卸载成功以后.
Function un.onUninstSuccess
    ReadRegStr $R0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
    ${WordReplace} $R0 ";$INSTDIR" "" "+" $R1
    WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$R1"
FunctionEnd

4、其它尝试

假如第三方软件在执行指令时数据被捕获,那加密方式太容易被察觉和解析,故曾考虑做一些简单的混淆,可在base64加密后的字符串前后或中间插入随机字符,然后将混淆字符的索引位置用另外的参数(如salt)标识出来;另外app在用parseInt做数据类型转换时有些行为特性,可用非数字字符对索引做进一步混淆。以上手段可稍微干扰一下不知情人士的思维,提高一点安全度。

5、注意事项

打包配置中,安装成功后执行了SendMessage ...用来刷新系统环境变量的配置。实测中,Win10 32位系统表现良好,但Win10 64位系统在安装完成后安装程序界面会出现一段时间的未响应,原因就是因为这一句指令;如果不使用该指令,那环境变量需在系统重启(或刷新)后才生效。项目中可根据实际需求进行取舍。

2人推荐
随时随地看视频
慕课网APP