标签 NsProcess 下的文章

Unicode NSIS调用nsProcess插件报错

!insertmacro: nsProcess::FindProcess
Invalid command: nsProcess::_FindProcess
Error in macro nsProcess::FindProcess on macroline 1
Error in script "C:\tunps.com.nsi" on line 236 -- aborting creation process

下载nsProcess 1.6.7,官方已经标明支持UNICODE,所以我想配合Unicode NSIS使用应该是没有问题的。我将包里面的\Include\nsProcess.nsh复制到Unicode NSIS程序目录下的Include目录。然后将\Plugin\nsProcessW.dll放入Unicode NSIS程序目录下的Plugin目录。结果编译nsi报以上错误信息。

因为没有看下载nsProcess里面的README就直接开始用了。所以没有察觉到需要将nsProcessW.dll重命名为nsProcess.dll的步骤。打开nsProcess.nsh头文件:

!define nsProcess::FindProcess `!insertmacro nsProcess::FindProcess`

!macro nsProcess::FindProcess _FILE _ERR
nsProcess::_FindProcess /NOUNLOAD `${_FILE}`
Pop ${_ERR}
!macroend


!define nsProcess::KillProcess `!insertmacro nsProcess::KillProcess`

!macro nsProcess::KillProcess _FILE _ERR
nsProcess::_KillProcess /NOUNLOAD `${_FILE}`
Pop ${_ERR}
!macroend

!define nsProcess::CloseProcess `!insertmacro nsProcess::CloseProcess`

!macro nsProcess::CloseProcess _FILE _ERR
nsProcess::_CloseProcess /NOUNLOAD `${_FILE}`
Pop ${_ERR}
!macroend


!define nsProcess::Unload `!insertmacro nsProcess::Unload`

!macro nsProcess::Unload
nsProcess::_Unload
!macroend

nsProcess DLL的实际上导出函数的名字是_FindProcess, _KillProcess, _CloseProcess, _Unload 前面的nsProcess::这个是根据文件名来变化的。所以解决这个问题有两个办法。

  1. 官方的方法:将nsProcessW.dll重命名为nsProcess.dll
  2. 另外一个方法是不修改nsProcessW.dll,将nsProcess.nsh文件里面的文本 nsProcess::_ 批量替换为nsProcessW::_

最后我想说看文档真的很重要啊!!