找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 333|回复: 2

[求助]:vb6.0中能否通过API查询到注册表中某个键下子键的名称?

[复制链接]
发表于 2005-4-23 15:02:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
我想通过查询注册表中Autodesk\AutoCAD键下子键的名称来判断AutoCAD的版本,同时再通过查询R16.1(本人的是2005)键下ACAD-301:804子键的Location项得到AutoCAD的安装路径,但是API中好象没有查询子键名称的函数,是我学得不够还是就没有这个函数?
主要是想通过修改C:\Program Files\AutoCAD 2005\Support目录下auto2005.lsp文件达到运行AutoCAD就能运行自己的VBA文件的目的?也就是主要解决VBA程序分发给别人,自己用vb6.0做一个相当于安装程序的小程序。
(以上注册表键名及文件路径只是本人机器上的,因版本和个人而异)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-4-23 21:41:40 | 显示全部楼层
很早以前下载的,没用过,你先试试吧:)

  1. Option Explicit
  2. ' 这个模块用于读和写注册表关键字。
  3. ' 不同于VB 的内部注册表访问方法,它可以
  4. ' 通过字符串的值来读和写任何注册表关键字。
  5. '---------------------------------------------------------------
  6. '-注册表 API 声明...
  7. 'RegCloseKey 用于关闭系统注册表中的一个项(或键)
  8. 'RegCreateKeyEx用于创建注册表项
  9. 'RegOpenKeyEx用于打开注册表项
  10. 'RegQueryValueEx 用于获取一个项的设置值
  11. 'RegSetValueEx 用于设置指定项的值
  12. '---------------------------------------------------------------
  13. Public Declare Function RegCloseKey Lib "advapi32" (ByVal hkey As Long) As Long
  14. Public Declare Function RegCreateKeyEx Lib "advapi32" Alias "RegCreateKeyExA" (ByVal hkey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByRef phkResult As Long, ByRef lpdwDisposition As Long) As Long
  15. Public Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hkey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
  16. Public Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hkey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
  17. Public Declare Function RegSetValueEx Lib "advapi32" Alias "RegSetValueExA" (ByVal hkey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
  18. '---------------------------------------------------------------
  19. '- 注册表 Api 常数...
  20. '---------------------------------------------------------------
  21. ' Reg Data Types...
  22. Public Const REG_SZ = 1 ' Unicode空终结字符串
  23. Public Const REG_EXPAND_SZ = 2 ' Unicode空终结字符串
  24. Public Const REG_DWORD = 4 ' 32-bit 数字
  25. Public Const REG_BINARY = 3
  26. ' 注册表创建类型值...
  27. Public Const REG_OPTION_NON_VOLATILE = 0 ' 当系统重新启动时,关键字被保留
  28. ' 注册表关键字安全选项...
  29. Public Const READ_CONTROL = &H20000
  30. Public Const KEY_QUERY_VALUE = &H1
  31. Public Const KEY_SET_VALUE = &H2
  32. Public Const KEY_CREATE_SUB_KEY = &H4
  33. Public Const KEY_ENUMERATE_SUB_KEYS = &H8
  34. Public Const KEY_NOTIFY = &H10
  35. Public Const KEY_CREATE_LINK = &H20
  36. Public Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL
  37. Public Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL
  38. Public Const KEY_EXECUTE = KEY_READ
  39. Public Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
  40. KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
  41. KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL

  42. ' 注册表关键字根类型...
  43. Public Const HKEY_CLASSES_ROOT = &H80000000
  44. Public Const HKEY_CURRENT_USER = &H80000001
  45. Public Const HKEY_LOCAL_MACHINE = &H80000002
  46. Public Const HKEY_USERS = &H80000003
  47. Public Const HKEY_PERFORMANCE_DATA = &H80000004

  48. ' 返回值...
  49. Public Const ERROR_NONE = 0
  50. Public Const ERROR_BADKEY = 2
  51. Public Const ERROR_ACCESS_DENIED = 8
  52. Public Const ERROR_SUCCESS = 0

  53. '---------------------------------------------------------------
  54. '- 注册表安全属性类型...
  55. '---------------------------------------------------------------
  56. Private Type SECURITY_ATTRIBUTES
  57. nLength As Long
  58. lpSecurityDescriptor As Long
  59. bInheritHandle As Boolean
  60. End Type
  61. '-------------------------------------------------------------------------------------------------
  62. '本函数在注册表中创建新的项及键值
  63. 'sample usage - Debug.Print UpodateKey(HKEY_CLASSES_ROOT, "keyname", "newvalue")
  64. '-------------------------------------------------------------------------------------------------
  65. Public Function UpdateKey(KeyRoot As Long, KeyName As String, SubKeyName As String, SubReg As Long, SubKeyValue As String, IngNumber As Long) As Long
  66.     Dim RC As Long ' 返回代码
  67.     Dim hkey As Long ' 处理一个注册表关键字
  68.     Dim hDepth As Long '
  69.     Dim lpAttr As SECURITY_ATTRIBUTES ' 注册表安全类型
  70.    
  71.     lpAttr.nLength = 50 ' 设置安全属性为缺省值...
  72.     lpAttr.lpSecurityDescriptor = 0 ' ...
  73.     lpAttr.bInheritHandle = True ' ...
  74.    
  75.     '------------------------------------------------------------
  76.     '- 创建/打开注册表关键字...
  77.     '创建/打开//KeyRoot//KeyName
  78.     ' 错误处理...
  79.     '------------------------------------------------------------
  80.     RC = RegCreateKeyEx(KeyRoot, KeyName, 0, "", 0, KEY_WRITE, lpAttr, hkey, hDepth)
  81.     If (RC <> ERROR_SUCCESS) Then GoTo CreateKeyError
  82.    
  83.     '------------------------------------------------------------
  84.     '- 创建/修改关键字值...
  85.     ' 要让RegSetValueEx() 工作需要输入一个空格...
  86.     ' 创建/修改关键字值
  87.     '- 关闭注册表关键字...
  88.     '------------------------------------------------------------
  89.     Select Case SubReg
  90.     Case REG_SZ
  91.         RC = RegSetValueEx(hkey, SubKeyName, 0, SubReg, SubKeyValue, IngNumber)
  92.         If (RC <> ERROR_SUCCESS) Then GoTo CreateKeyError
  93.     End Select
  94.     RC = RegCloseKey(hkey) ' 退出
  95.     Exit Function ' 错误处理
  96. CreateKeyError:
  97.     UpdateKey = False ' 设置错误返回代码
  98.     RC = RegCloseKey(hkey) ' 试图关闭关键字
  99. End Function

  100. '-------------------------------------------------------------------------------------------------
  101. '本函数在注册表中读取键值
  102. 'sample usage - Debug.Print GetKeyValue(HKEY_CLASSES_ROOT, "COMCTL.ListviewCtrl.1\CLSID", "")
  103. '-------------------------------------------------------------------------------------------------
  104. Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String) As String
  105.     Dim i As Long ' 循环计数器
  106.     Dim RC As Long ' 返回代码
  107.     Dim hkey As Long ' 处理打开的注册表关键字
  108.     Dim hDepth As Long '
  109.     Dim sKeyVal As String
  110.     Dim lKeyValType As Long ' 注册表关键字数据类型
  111.     Dim tmpVal As String ' 注册表关键字的临时存储器
  112.     Dim KeyValSize As Long ' 注册表关键字变量尺寸
  113.    
  114.     ' 在 KeyRoot {HKEY_LOCAL_MACHINE...} 下打开注册表关键字
  115.     '------------------------------------------------------------
  116.     RC = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hkey) ' 打开注册表关键字
  117.     If (RC <> ERROR_SUCCESS) Then GoTo GetKeyError ' 处理错误...
  118.     tmpVal = String$(1024, 0) ' 分配变量空间
  119.     KeyValSize = 1024 ' 标记变量尺寸
  120.    
  121.     '------------------------------------------------------------
  122.     ' 检索注册表关键字的值...
  123.     '------------------------------------------------------------
  124.     RC = RegQueryValueEx(hkey, SubKeyRef, 0, _
  125.     lKeyValType, tmpVal, KeyValSize) ' 获得/创建关键字的值
  126.     If (RC <> ERROR_SUCCESS) Then GoTo GetKeyError ' 错误处理
  127.     tmpVal = Left$(tmpVal, InStr(tmpVal, Chr(0)) - 1)
  128.    
  129.     '------------------------------------------------------------
  130.     ' 决定关键字值的转换类型...
  131.     '------------------------------------------------------------
  132.     Select Case lKeyValType ' 搜索数据类型...
  133.     Case REG_SZ, REG_EXPAND_SZ ' 字符串注册表关键字数据类型
  134.         sKeyVal = tmpVal ' 复制字符串的值
  135.     Case REG_DWORD ' 四字节注册表关键字数据类型
  136.         For i = Len(tmpVal) To 1 Step -1 ' 转换每一位
  137.             sKeyVal = sKeyVal + Hex(Asc(Mid(tmpVal, i, 1))) ' 一个字符一个字符地生成值。
  138.         Next
  139.         sKeyVal = Format$("&h" + sKeyVal) ' 转换四字节为字符串
  140.     End Select
  141.    
  142.     GetKeyValue = sKeyVal ' 返回值
  143.     RC = RegCloseKey(hkey) ' 关闭注册表关键字
  144.     Exit Function ' 退出
  145. GetKeyError:     ' 错误发生过后进行清除...
  146.     GetKeyValue = vbNullString ' 设置返回值为空字符串
  147.     RC = RegCloseKey(hkey) ' 关闭注册表关键字
  148. End Function
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-3 12:44:55 | 显示全部楼层
二楼提供的代码在VBA中是否有效?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 13:50 , Processed in 0.363709 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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