ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3820|回复: 5

[原创] 批量获得COM加载项的程序路径

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-6-23 17:13 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:插件开发
本帖最后由 wqfzqgk 于 2012-6-23 17:14 编辑
  1. ' 这个模块用于读和写注册表关键字。
  2. ' 不同于VB 的内部注册表访问方法,它可以
  3. ' 通过字符串的值来读和写任何注册表关键字。

  4. '---------------------------------------------------------------
  5. '- 注册表 Api 常数...
  6. '---------------------------------------------------------------
  7. ' Reg Data Types...
  8. Const REG_SZ = 1                         ' Unicode空终结字符串
  9. Const REG_EXPAND_SZ = 2                  ' Unicode空终结字符串
  10. Const REG_DWORD = 4                      ' 32-bit 数字
  11. ' 注册表创建类型值...
  12. Const REG_OPTION_NON_VOLATILE = 0       ' 当系统重新启动时,关键字被保留
  13. ' 注册表关键字安全选项...
  14. Const READ_CONTROL = &H20000
  15. Const KEY_QUERY_VALUE = &H1
  16. Const KEY_SET_VALUE = &H2
  17. Const KEY_CREATE_SUB_KEY = &H4
  18. Const KEY_ENUMERATE_SUB_KEYS = &H8
  19. Const KEY_NOTIFY = &H10
  20. Const KEY_CREATE_LINK = &H20
  21. Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL
  22. Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL
  23. Const KEY_EXECUTE = KEY_READ
  24. Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
  25.                        KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
  26.                        KEY_NOTIFY KEY_CREATE_LINK + READ_CONTROL
  27.                      
  28. ' 注册表关键字根类型...
  29. Const HKEY_CLASSES_ROOT = &H80000000
  30. Const HKEY_CURRENT_USER = &H80000001
  31. Const HKEY_LOCAL_MACHINE = &H80000002
  32. Const HKEY_USERS = &H80000003
  33. Const HKEY_PERFORMANCE_DATA = &H80000004
  34. ' 返回值...
  35. Const ERROR_NONE = 0
  36. Const ERROR_BADKEY = 2
  37. Const ERROR_ACCESS_DENIED = 8
  38. Const ERROR_SUCCESS = 0
  39. '---------------------------------------------------------------
  40. '- 注册表安全属性类型...
  41. '---------------------------------------------------------------
  42. Private Type SECURITY_ATTRIBUTES
  43.     nLength As Long
  44.     lpSecurityDescriptor As Long
  45.     bInheritHandle As Boolean
  46. End Type
  47. ' 这个模块用于读和写注册表关键字。
  48. ' 不同于VB 的内部注册表访问方法,它可以
  49. ' 通过字符串的值来读和写任何注册表关键字。

  50. '---------------------------------------------------------------
  51. '-注册表 API 声明...
  52. '---------------------------------------------------------------
  53. Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
  54. Private 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
  55. Private 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
  56. Private 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
  57. Private 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
  58. '-------------------------------------------------------------------------------------------------
  59. 'sample usage - Debug.Print GetKeyValue(HKEY_CLASSES_ROOT, "COMCTL.ListviewCtrl.1\CLSID", "")
  60. '-------------------------------------------------------------------------------------------------
  61. Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String) As String
  62.     Dim i As Long                                           ' 循环计数器
  63.     Dim rc As Long                                          ' 返回代码
  64.     Dim hKey As Long                                        ' 处理打开的注册表关键字
  65.     Dim hDepth As Long                                      '
  66.     Dim sKeyVal As String
  67.     Dim lKeyValType As Long                                 ' 注册表关键字数据类型
  68.     Dim tmpVal As String                                    ' 注册表关键字的临时存储器
  69.     Dim KeyValSize As Long                                  ' 注册表关键字变量尺寸
  70.    
  71.     ' 在 KeyRoot {HKEY_LOCAL_MACHINE...} 下打开注册表关键字
  72.     '------------------------------------------------------------
  73.     rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey) ' 打开注册表关键字
  74.    
  75.     If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' 处理错误...
  76.    
  77.     tmpVal = String$(1024, 0)                             ' 分配变量空间
  78.     KeyValSize = 1024                                       ' 标记变量尺寸
  79.    
  80.     '------------------------------------------------------------
  81.     ' 检索注册表关键字的值...
  82.     '------------------------------------------------------------
  83.     rc = RegQueryValueEx(hKey, SubKeyRef, 0, _
  84.                          lKeyValType, tmpVal, KeyValSize)    ' 获得/创建关键字的值
  85.                         
  86.     If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' 错误处理
  87.       
  88.     tmpVal = Left$(tmpVal, InStr(tmpVal, Chr(0)) - 1)
  89.     '------------------------------------------------------------
  90.     ' 决定关键字值的转换类型...
  91.     '------------------------------------------------------------
  92.     Select Case lKeyValType                                  ' 搜索数据类型...
  93.     Case REG_SZ, REG_EXPAND_SZ                              ' 字符串注册表关键字数据类型
  94.         sKeyVal = tmpVal                                     ' 复制字符串的值
  95.     Case REG_DWORD                                          ' 四字节注册表关键字数据类型
  96.         For i = Len(tmpVal) To 1 Step -1                    ' 转换每一位
  97.             sKeyVal = sKeyVal + Hex(Asc(Mid(tmpVal, i, 1)))   ' 一个字符一个字符地生成值。
  98.         Next
  99.         sKeyVal = Format$("&h" + sKeyVal)                     ' 转换四字节为字符串
  100.     End Select
  101.    
  102.     GetKeyValue = sKeyVal                                   ' 返回值
  103.     rc = RegCloseKey(hKey)                                  ' 关闭注册表关键字
  104.     Exit Function                                           ' 退出
  105.    
  106. GetKeyError:    ' 错误发生过后进行清除...
  107.     GetKeyValue = vbNullString                              ' 设置返回值为空字符串
  108.     rc = RegCloseKey(hKey)                                  ' 关闭注册表关键字
  109. End Function


  110. '-------------------------------------------------------------------------------------------------
  111. 'sample usage - Debug.Print UpodateKey(HKEY_CLASSES_ROOT, "keyname", "newvalue")
  112. '-------------------------------------------------------------------------------------------------
  113. Public Function UpdateKey(KeyRoot As Long, KeyName As String, SubKeyName As String, SubKeyValue As String) As Boolean
  114.     Dim rc As Long                                      ' 返回代码
  115.     Dim hKey As Long                                    ' 处理一个注册表关键字
  116.     Dim hDepth As Long                                  '
  117.     Dim lpAttr As SECURITY_ATTRIBUTES                   ' 注册表安全类型
  118.    
  119.     lpAttr.nLength = 50                                 ' 设置安全属性为缺省值...
  120.     lpAttr.lpSecurityDescriptor = 0                     ' ...
  121.     lpAttr.bInheritHandle = True                        ' ...
  122.     '------------------------------------------------------------
  123.     '- 创建/打开注册表关键字...
  124.     '------------------------------------------------------------
  125.     rc = RegCreateKeyEx(KeyRoot, KeyName, _
  126.                         0, REG_SZ, _
  127.                         REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpAttr, _
  128.                         hKey, hDepth)                   ' 创建/打开//KeyRoot//KeyName
  129.    
  130.     If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError   ' 错误处理...
  131.    
  132.     '------------------------------------------------------------
  133.     '- 创建/修改关键字值...
  134.     '------------------------------------------------------------
  135.     If (SubKeyValue = "") Then SubKeyValue = " "        ' 要让RegSetValueEx() 工作需要输入一个空格...
  136.    
  137.     ' 创建/修改关键字值
  138.     rc = RegSetValueEx(hKey, SubKeyName, _
  139.                        0, REG_SZ, _
  140.                        SubKeyValue, LenB(StrConv(SubKeyValue, vbFromUnicode)))
  141.                        
  142.     If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError   ' 错误处理
  143.     '------------------------------------------------------------
  144.     '- 关闭注册表关键字...
  145.     '------------------------------------------------------------
  146.     rc = RegCloseKey(hKey)                              ' 关闭关键字
  147.    
  148.     UpdateKey = True                                    ' 返回成功
  149.     Exit Function                                       ' 退出
  150. CreateKeyError:
  151.     UpdateKey = False                                   ' 设置错误返回代码
  152.     rc = RegCloseKey(hKey)                              ' 试图关闭关键字
  153. End Function
  154. Sub test()
  155. For i = 1 To Application.COMAddIns.Count
  156. Debug.Print GetKeyValue(HKEY_LOCAL_MACHINE, "Software\Classes\CLSID" & Application.COMAddIns(i).GUID & "\InprocServer32", "")
  157. Next
  158. 'Shell "regsvr32 /s " & GetKeyValue(HKEY_LOCAL_MACHINE, "Software\Classes\CLSID" & "{801FE3E2-5F8E-4C13-B8C0-E271A8BFF577}" & "\InprocServer32", "")
  159. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-23 17:17 | 显示全部楼层
直接套用的VB6的注册表模块,没有更改。第二句就可以实现加载项的注册。近期研究加载项的批量管理,网上的几个没有VSTO的注册,不是很爽。其实VSTO的更简单,有VSINSTALL就可以自动的安装。稍后再做

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-23 17:26 | 显示全部楼层
vsto中更简单:其实循环中加一句就可以
My.Computer.Registry.LocalMachine.OpenSubKey("Software\Classes\CLSID\" & Application.COMAddIns(i).GUID & "\InprocServer32").getvalue ("")
呵呵,我没试,估计没有问题

TA的精华主题

TA的得分主题

发表于 2012-6-23 18:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
支持一下.....

TA的精华主题

TA的得分主题

发表于 2012-7-15 08:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-11-9 14:32 | 显示全部楼层
弄得太复杂了,3句就好

Sub test()
    On Error Resume Next
    For i = 1 To Application.COMAddIns.Count
        Cells(i, 1) = CreateObject("WScript.Shell").RegRead("HKLM\SOFTWARE\Classes\CLSID\" & Application.COMAddIns(i).GUID & "\InprocServer32\")
    Next
End Sub
执行结果:
1.jpg

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-18 14:25 , Processed in 0.034035 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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