明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6041|回复: 11

[【高飞鸟】] 用StdRegProv类操纵注册表

  [复制链接]
发表于 2013-5-23 00:02:55 | 显示全部楼层 |阅读模式
本帖最后由 highflybir 于 2013-5-23 09:12 编辑

此问题的来源:http://bbs.mjtd.com/thread-101515-1-1.html
说明:在很多场合,CAD要读写注册表,对于二进制内容的读写,方法种种:
    用CAD本身的函数外部程序方法: (startapp "regedit" regfile)                                 
    VLisp 的方法:
  1. (vl-registry-read reg-key [val-name])
  2. (vl-registry-write reg-key [val-name val-data])

    ACET  的方法:
  1. (acet-reg-get path key)         
  2. (acet-reg-put path key value)

     WSH   的方法:  
  1. (vlax-invoke wsh 'RegRead RegPath)   
  2. (vlax-invoke wsh 'RegWrite RegPath Value "键值类型")
         
    还有DOSLIB等等。
    这些方法都有一定的缺陷.下面的程序我用了WMI的注册表的StdRegProv类,使得程序可 以更加通用和强大.
    注: 读写注册表在一些windows上需要以管理员身份运行,可能要关闭某些杀毒软件.  
  1. (defun C:test (/ CTX DATA HKLM INPARAMS METHODS OREG OUTPARAMS SUBKEYNAME SVR SYS UVALUE WMI)
  2.   ;;; 注意: 此处的lst的数据皆是不超过255的正整数,相当于把16进制转化为10进制。
  3.   (defun MakeBinaryVariant (lst / a)
  4.     (setq a (vlax-make-safearray vlax-vbvariant (cons 0 (1- (length lst)))))
  5.     (vlax-safearray-fill a (mapcar (function (lambda (x) (vlax-make-variant x 17))) lst))
  6.     (vlax-make-variant a)
  7.   )
  8.   ;;;判断系统是否为64位
  9.   (defun Is64Bit (/ WMI SVR SYS)
  10.     (setq WMI (vlax-create-object "WbemScripting.SWbemLocator"))
  11.     (setq SVR (VLAX-INVOKE WMI 'ConnectServer))
  12.     (vlax-for n (vlax-invoke SVR 'InstancesOf "Win32_ComputerSystem")
  13.       (setq SYS (vlax-get n 'SystemType))
  14.     )
  15.     (vlax-release-object SVR)
  16.     (vlax-release-object WMI)
  17.     (wcmatch sys "x64*")
  18.   )
  19.   
  20.   (setq WMI (vlax-create-object "WbemScripting.SWbemLocator"))                                ;关于这个物体用途太多
  21.   (setq CTX (vlax-create-object "WbemScripting.SWbemNamedValueSet"))
  22.   (setq SVR (VLAX-INVOKE WMI 'ConnectServer))
  23.   (setq oReg (vlax-invoke SVR 'get "StdRegProv"))                                        ;获得注册表对象
  24.   (setq HKLM (+ 3 2147483647))                                                           ;此处不可直接写2147483650
  25.   
  26.   (vlax-invoke oReg 'CreateKey hklm "Software\\MyKey1\\MySubKey1")                        ;创建项和子项
  27.   (if (Is64Bit)
  28.     (setq subkeyName "SOFTWARE\\Wow6432Node\\MyKey1\\MySubKey1")                        ;对于64位的可能会创建在这个位置
  29.     (setq subkeyName "SOFTWARE\\MyKey1\\MySubKey1")                                        ;对于32位的可能会创建在这个位置
  30.   )
  31.   (setq methods (vlax-get oReg 'methods_))
  32.   
  33.   ;;以下为在注册表中创建一个二进制的值的示例:
  34.   (setq Inparams (vlax-get (vlax-invoke methods 'item "SetBinaryValue") 'Inparameters)) ;输入参数
  35.   (vlax-put InParams 'Hdefkey HKLM)                                                        ;根键
  36.   (vlax-put Inparams 'Ssubkeyname subkeyName)                                                 ;子键
  37.   (vlax-put Inparams 'Svaluename "BinaryTest")                                                ;要创建的二进制值的名称
  38.   (setq uValue (vlax-invoke (vlax-get inparams 'properties_) 'item "uValue"))           ;二进制为uValue,字符串为sValue
  39.   (setq data (MakeBinaryVariant '(122 123 232)))                                        ;一定要转换此种数据类型,否则提示参数不匹配(数据要把16进制转为十进制)
  40.   (vlax-put-property uValue 'Value data)                                                ;此处一定要用vlax-put-property
  41.   
  42.   (setq OutParams (vlax-invoke oReg 'ExecMethod_ "SetBinaryValue" Inparams nil CTX))    ;然后开始设置,修改注册表
  43.   (if (zerop (vlax-get OutParams 'ReturnValue))                                                ;返回值为0代表成功
  44.     (alert "修改成功!")
  45.     (alert (vlax-invoke OutParams 'GetObjectText_))
  46.   )
  47.   (vlax-release-object uValue)
  48.   (vlax-release-object OutParams)
  49.   (vlax-release-object Inparams)
  50.   
  51.   ;;以下为在注册表中读取二进制值的内容的示例:
  52.   (setq Inparams (vlax-get (vlax-invoke methods 'item "GetBinaryValue") 'Inparameters))
  53.   (vlax-put InParams 'Hdefkey HKLM)                                                        ;根键
  54.   (vlax-put Inparams 'Ssubkeyname subkeyName)                                                 ;子键
  55.   (vlax-put Inparams 'Svaluename "BinaryTest")                                                ;要创建的二进制值的名称
  56.   (setq OutParams (vlax-invoke oReg 'ExecMethod_ "GetBinaryValue" Inparams nil CTX))    ;然后开始读取注册表
  57.   (if (zerop (vlax-get OutParams 'ReturnValue))                                                ;返回值为0代表成功
  58.     (princ (vlax-get Outparams 'uValue))                                                ;则返回此数据内容
  59.     (alert (vlax-invoke OutParams 'GetObjectText_))
  60.   )

  61.   ;;最好释放所创建的对象
  62.   (vlax-release-object OutParams)
  63.   (vlax-release-object Inparams)
  64.   (vlax-release-object Methods)
  65.   (vlax-release-object SVR)
  66.   (vlax-release-object CTX)
  67.   (vlax-release-object WMI)
  68.   (princ)
  69. )

附件如下

另外:可以供读者参考的链接:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa394600(v=vs.85).aspx
http://hi.baidu.com/chinarzq/item/370b1b385c39064d033edc15

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +2 收起 理由
muwind + 1 很给力!
redcat + 1 高飞兄的 没得说的

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2023-1-1 11:38:55 | 显示全部楼层
谢谢分享,非常强大。只是我运行时出现了错误。(setq svr (vlax-invoke WMI 'CONNECTSERVER))这句说时实参太少。为什么呢?
发表于 2022-8-22 09:37:16 | 显示全部楼层
谢谢分享        
发表于 2013-5-23 01:30:00 | 显示全部楼层
我爱高飞鸟
发表于 2013-5-23 08:30:49 | 显示全部楼层
附件似乎无法下载,其它帖子正常。。。

点评

重新下载看看  发表于 2013-5-23 08:57
发表于 2013-5-23 09:02:01 | 显示全部楼层
本帖最后由 xiaxiang 于 2013-5-23 09:17 编辑

似乎还是不行,其它帖子是好的。不知道别人是否能下到?

已经正常,感谢高飞鸟!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

可以下载,不用360就好了  发表于 2013-5-23 11:04
我已经删除了重新上传  发表于 2013-5-23 09:13
发表于 2013-5-23 11:06:53 | 显示全部楼层
太深了,粗看了一下,希望自己有机会能运用上
发表于 2013-5-23 12:59:06 | 显示全部楼层
顶一下,正用得上。有码就是妈啊。
发表于 2013-5-23 13:06:11 | 显示全部楼层
见一个收藏一个
发表于 2013-5-24 00:56:06 来自手机 | 显示全部楼层
看不懂呢?来自: Android客户端
发表于 2013-8-10 07:10:38 | 显示全部楼层
不错,支持
发表于 2013-9-3 17:17:28 | 显示全部楼层
用上了,很好
高飞鸟真棒!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-26 22:41 , Processed in 0.195507 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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