设为首页 收藏本站

NSIS中文论坛

查看: 838|回复: 3

[求助] 检查某注册表键是否存在,64位注册表如何实现?

[复制链接]

该用户从未签到

5

主题

27

帖子

152

积分

积分
152
发表于 2017-1-3 20:47:42 | 显示全部楼层 |阅读模式
!include "x64.nsh" #---------加入64位头文件----------
!include "Registry.nsh"
!include "Usefullib.nsh"
${ReadRegBin} ;;声明ReadRegBin函数


《NSIS图文教程集锦》中用法:

; OpenReg.nsi
; 检查某注册表键是否存在的NSIS例子
; 编写:zhfi <zhfi1022@tom.com>

;--------------------------------
;定义注册表主键
!define HKEY_CLASSES_ROOT           0x80000000
!define HKEY_CURRENT_USER           0x80000001
!define HKEY_LOCAL_MACHINE          0x80000002
!define HKEY_USERS                  0x80000003

OutFile OpenReg.exe

XPStyle on

!include LogicLib.nsh

;--------------------------------
Name OpenReg

Section Nil
SectionEnd

Function .onInit
SetRegView 64
;为键的句柄创建一个缓存
System::Call "*(i 0) i .R0"
;将要检测的键放入内存中
Push "SOFTWARE\TENCENT\QQPinYin"
;调用API进行检查,返回值在$R1中
system::call 'Advapi32::RegOpenKey(i ${HKEY_LOCAL_MACHINE}, t s, i R0) .iR1'
;关闭该键的句柄
system::call 'Advapi32::RegCloseKey(i R0)'
;释放内存
system::free
;返回值:
;0代表键存在
;2代表键不存在
;其它值表示出错
${If} $R1 == 0
Messagebox mb_ok "Key Exists!"
${ElseIf} $R1 == 2
Messagebox mb_ok "Key doesn't Exists!"
${Else}
Messagebox mb_ok "Error!"
${EndIf}
Pop $R1
Pop $R0
Quit
FunctionEnd

=============================
对64位注册表操作,实测利用RegOpenKey这个API的返回值进行判断无效!应该使用RegOpenKeyEx这个API函数加上KEY_WOW64_64KEY权限,但在NSIS中怎样使用我不知道。

我要检测的是64位注册表HKEY_LOCAL_MACHINE中的一个二进制值是否存在。
SOFTWARE\MyTest 中建一个值MyBinValue  手动写入一组二进制数据,
采用Usefullib.nsh的方法:
SetRegView 64
${ReadRegBin} $R2 ${HKLM} "SOFTWARE\MyTest" "MyBinValue"
仍然无效!在 SOFTWARE\Wow6432Node\MyTest 中建一个值MyBinValue  手动写入一组二进制数据,测试能读到,证明只能读取32位注册表。
也证明:
SetRegView 64  仅对《NSIS用户用册》中的诸如 WriteRegBin 等等命令才有效,但奇怪的是没有 ReadRegBin 这个命令。
怎样判断64位注册表某健是否存在,或者读取某项的二进制值?我现在彻底没办法了。请教哪位知道?




回复

使用道具 举报

该用户从未签到

5

主题

27

帖子

152

积分

积分
152
 楼主| 发表于 2017-1-3 20:49:37 | 显示全部楼层
本帖最后由 zww3008 于 2017-1-3 20:55 编辑

采用Registry.nsh方法:





SetRegView 64
        ${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\MyTest" $R0
        MessageBox MB_OK "registry::KeyExists$\n$\n\
                        Errorlevel: [$R0]"

经测试用样只能适用于32位注册表,不能用于64位注册表。




回复 支持 反对

使用道具 举报

  • TA的每日心情

    2017-10-12 13:43
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    12

    主题

    43

    帖子

    892

    积分

    积分
    892
    发表于 2017-1-20 11:19:15 | 显示全部楼层
    用ReadRegstr,然后对比值试试
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-10-12 13:43
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    12

    主题

    43

    帖子

    892

    积分

    积分
    892
    发表于 2017-1-20 11:35:48 | 显示全部楼层
    NSIS生成的安装程序是32位程序,在64位系统上访问注册表会重定向到wow6432node.

    使用 SetRegView 64 将允许安装程序在 x64 中访问注册表键值。

    它将影响 DeleteRegKey, DeleteRegValue, EnumRegKey, EnumRegValue, ReadRegDWORD, ReadRegStr, WriteRegBin, WriteRegDWORD, WriteRegStr 和 WriteRegExpandStr。

    它不会影响 InstallDirRegKey。另外,在函数 .onInit 中也可使用 ReadRegStr 读取注册表。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|联系我们|NSIS中文论坛    

    GMT+8, 2017-10-21 07:36 , Processed in 0.092333 second(s), 13 queries , MemCache On.

    Powered by Discuz!X3.3

    © 2015-2017 NSISFANS.COM

    快速回复 返回顶部 返回列表