内容目录
问题
今天发现node js创建key时候会出现 unsupported hive 错误,这样子就导致程序异常!!!
我发现这个必然会出现这个错误。
解决过程
- 重现
- 发现版本 5.1.1 一定出现
- 跟踪JS到swf文件
- 分析swf代码,发现返回错误地方
- 加msgbox 提示会发现循环时候有一处undefined 判断不准,没有过滤掉,导致进入代码逻辑,这个时候应该循环完成
测试代码
async function test(){
await regedit.createKey(['HKCU\\SOFTWARE\\MyApp'])
}
test();
官方代码写法,所以不可能有什么问题。
修改regCreateKey.swf 代码测试
Do While Not stdin.AtEndOfLine
strLine = stdin.ReadLine()
msgbox(strLine)
strLine = unescape(trim(strLine))
If IsNull(strLine) or strLine = "" Then
WScript.Quit 25127
End If
ParseHiveAndSubKey strLine, constHive, strSubKey
if IsNull(constHive) Then
WriteLineErr "unsupported hive " & strLine
WScript.Quit 25122
End If
Result = CreateKey(constHive, strSubKey)
If Not Result = 0 Then
WScript.Quit Result
End If
Loop
我在代码第三行增加msgbox,其实我在别的地方也增加了,开始以为 ParseHiveAndSubKey 代码有问题,后面发现其实没有问题的。
解决方案
一、不修改regedit的代码
async function test(){
//await regedit.createKey(['HKCU\\SOFTWARE\\MyApp'])
await regedit.createKey(['','HKCU\\SOFTWARE\\MyApp'])
}
数组第一个增加空的字符串,这样子就没有undefined出现。
第二、修改swf文件
过滤掉为undefine的情况
putvalue 也有这个问题
我真的服了,这个库没有进行测试吗?直接提交了。。。
找到node_modules\regedit\vbs\regPutValue.wsf
增加undefined 检测,如果检测到,就直接退出。这样子能简单跑起来,这个库可能后面会进行更新,应该会修复这个问题,一个注册表还不如用c++写一个exe给nodejs 调用。反正这里也是调用vbs。。。
Do While Not stdin.AtEndOfLine
strLine = stdin.ReadLine()
strLine = unescape(trim(strLine))
If strLine = "undefined" Then
WScript.Quit 0
End if
如果electron 简单补丁同理,自己修改外部vbs文件夹里面的对应文件即可。
错误逻辑
我没有仔细分析原因,大概分析一下而已,启动进程参数进行解析有问题,但不知道这种低级错误怎么会出现,随便跑一个测试就会出现。