ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请问,能否用VBA返回Windows系统中某类文件的默认打开程序的目录地址?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-7-15 11:40 | 显示全部楼层 |阅读模式
比如返回 后缀为 .xls 的文件默认打开程序的目录(应该就是application的目录吧)
再比如返回 后缀为 .JPG 的文件默认打开程序的目录
等等吧
谢谢!

TA的精华主题

TA的得分主题

发表于 2013-7-15 13:30 | 显示全部楼层
感觉有点难度!恐怕要用VBA读取系统注册表才能实现。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-15 13:38 | 显示全部楼层
老谭酸菜 发表于 2013-7-15 13:30
感觉有点难度!恐怕要用VBA读取系统注册表才能实现。

好像我特弱智是的,不过确实呆了。我是想通过一个文件的后缀,返回打开该文件的默认软件的安装路径,不知道说清楚没有啊?谢谢了

TA的精华主题

TA的得分主题

发表于 2013-7-15 16:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
其实很简单,就是读取注册表的内容,呵,要分两步,第一步,读取文件对应的键值,第二步,根据键值读出对应的程序
  1. Option Explicit
  2.   Public Const REG_SZ As Long = 1
  3.   Public Const REG_DWORD As Long = 4

  4.   Public Const HKEY_CLASSES_ROOT = &H80000000
  5.   Public Const HKEY_CURRENT_USER = &H80000001
  6.   Public Const HKEY_LOCAL_MACHINE = &H80000002
  7.   Public Const HKEY_USERS = &H80000003

  8.   Public Const ERROR_NONE = 0
  9.   Public Const ERROR_BADDB = 1
  10.   Public Const ERROR_BADKEY = 2
  11.   Public Const ERROR_CANTOPEN = 3
  12.   Public Const ERROR_CANTREAD = 4
  13.   Public Const ERROR_CANTWRITE = 5
  14.   Public Const ERROR_OUTOFMEMORY = 6
  15.   Public Const ERROR_ARENA_TRASHED = 7
  16.   Public Const ERROR_ACCESS_DENIED = 8
  17.   Public Const ERROR_INVALID_PARAMETERS = 87
  18.   Public Const ERROR_NO_MORE_ITEMS = 259

  19.   Public Const KEY_QUERY_VALUE = &H1
  20.   Public Const KEY_SET_VALUE = &H2
  21.   Public Const KEY_ALL_ACCESS = &H3F

  22.   Public Const REG_OPTION_NON_VOLATILE = 0

  23.   Declare Function RegCloseKey Lib "advapi32.dll" _
  24.    (ByVal hKey As Long) As Long
  25.   Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias _
  26.    "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
  27.    ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions _
  28.    As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes _
  29.    As Long, phkResult As Long, lpdwDisposition As Long) As Long
  30.   Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias _
  31.    "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
  32.    ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As _
  33.    Long) As Long
  34.   Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
  35.    "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  36.    String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
  37.    As String, lpcbData As Long) As Long
  38.   Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _
  39.    "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  40.    String, ByVal lpReserved As Long, lpType As Long, lpData As _
  41.    Long, lpcbData As Long) As Long
  42.   Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _
  43.    "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  44.    String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
  45.    As Long, lpcbData As Long) As Long
  46.   Declare Function RegSetValueExString Lib "advapi32.dll" Alias _
  47.    "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
  48.    ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As _
  49.    String, ByVal cbData As Long) As Long
  50.   Declare Function RegSetValueExLong Lib "advapi32.dll" Alias _
  51.    "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
  52.    ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, _
  53.    ByVal cbData As Long) As Long

  54. ''''''''''''''''''''
  55. '主函数
  56. Sub main()
  57. MsgBox "XLS文件的默认打开程序为:" & vbCrLf & GetProNameByType("XLS")
  58. End Sub




  59. Function GetProNameByType(strFileType As String) As String
  60.     Dim strTemp As String
  61.    
  62.     strFileType = "." & strFileType
  63.     strTemp = QueryValue(strFileType, "")
  64.     strTemp = strTemp & "\shell\Open\command"
  65.     strTemp = QueryValue(strTemp, "")
  66.     strTemp = Replace(strTemp, Chr(34), "")
  67.     strTemp = LCase(strTemp)
  68.     If InStr(strTemp, ".exe") > 0 Then
  69.         GetProNameByType = Split(strTemp, ".exe")(0) & ".exe"
  70.     Else
  71.         GetProNameByType = ""
  72.     End If
  73. End Function

  74. Private Function QueryValue(sKeyName As String, sValueName As String) As Variant
  75.     Dim lRetVal As Long      'API函数的结果
  76.     Dim hKey As Long         '打开的键的句柄
  77.     Dim vValue As Variant      '查询的值的设置

  78.     lRetVal = RegOpenKeyEx(HKEY_CLASSES_ROOT, sKeyName, 0, KEY_QUERY_VALUE, hKey)
  79.     lRetVal = QueryValueEx(hKey, sValueName, vValue)
  80.    
  81.     QueryValue = vValue
  82.     RegCloseKey (hKey)
  83. End Function

  84. Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As _
  85.    String, vValue As Variant) As Long
  86.     Dim cch As Long
  87.     Dim lrc As Long
  88.     Dim lType As Long
  89.     Dim lValue As Long
  90.     Dim sValue As String

  91.     On Error GoTo QueryValueExError

  92.     ' 确定读取的数据类型和大小
  93.     lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
  94.     If lrc <> ERROR_NONE Then Error 5

  95.     Select Case lType
  96.         ' 字符串
  97.         Case REG_SZ:
  98.             sValue = String(cch, 0)

  99.             lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, _
  100.                    sValue, cch)
  101.             If lrc = ERROR_NONE Then
  102.                    vValue = Left$(sValue, cch - 1)
  103.             Else
  104.                    vValue = Empty
  105.             End If
  106.         ' DWORDS
  107.         Case REG_DWORD:
  108.             lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, _
  109.                  lValue, cch)
  110.             If lrc = ERROR_NONE Then vValue = lValue
  111.         Case Else
  112.             '所有不支持的其它数据类型
  113.             lrc = -1
  114.     End Select

  115. QueryValueExExit:
  116.     QueryValueEx = lrc
  117.     Exit Function

  118. QueryValueExError:
  119.      Resume QueryValueExExit
  120. End Function



复制代码
附件: 注册表.rar (14.13 KB, 下载次数: 2)

TA的精华主题

TA的得分主题

发表于 2013-7-15 16:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
有点超出了 excel 的范畴

TA的精华主题

TA的得分主题

发表于 2013-7-15 16:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
郁闷,发了贴,被移动到了回收站,只好再发
分二步,全部是注册表操作:
1.读取后缀名对应的键值
2.根据键值,读取打开的程序名
附件: 注册表.rar (14.13 KB, 下载次数: 2)

代码:
  1. Option Explicit
  2.   Public Const REG_SZ As Long = 1
  3.   Public Const REG_DWORD As Long = 4
  4.   Public Const HKEY_CLASSES_ROOT = &H80000000
  5.   Public Const HKEY_CURRENT_USER = &H80000001
  6.   Public Const HKEY_LOCAL_MACHINE = &H80000002
  7.   Public Const HKEY_USERS = &H80000003
  8.   Public Const ERROR_NONE = 0
  9.   Public Const ERROR_BADDB = 1
  10.   Public Const ERROR_BADKEY = 2
  11.   Public Const ERROR_CANTOPEN = 3
  12.   Public Const ERROR_CANTREAD = 4
  13.   Public Const ERROR_CANTWRITE = 5
  14.   Public Const ERROR_OUTOFMEMORY = 6
  15.   Public Const ERROR_ARENA_TRASHED = 7
  16.   Public Const ERROR_ACCESS_DENIED = 8
  17.   Public Const ERROR_INVALID_PARAMETERS = 87
  18.   Public Const ERROR_NO_MORE_ITEMS = 259
  19.   Public Const KEY_QUERY_VALUE = &H1
  20.   Public Const KEY_SET_VALUE = &H2
  21.   Public Const KEY_ALL_ACCESS = &H3F
  22.   Public Const REG_OPTION_NON_VOLATILE = 0
  23.   Declare Function RegCloseKey Lib "advapi32.dll" _
  24.    (ByVal hKey As Long) As Long
  25.   Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias _
  26.    "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
  27.    ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions _
  28.    As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes _
  29.    As Long, phkResult As Long, lpdwDisposition As Long) As Long
  30.   Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias _
  31.    "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
  32.    ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As _
  33.    Long) As Long
  34.   Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
  35.    "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  36.    String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
  37.    As String, lpcbData As Long) As Long
  38.   Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _
  39.    "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  40.    String, ByVal lpReserved As Long, lpType As Long, lpData As _
  41.    Long, lpcbData As Long) As Long
  42.   Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _
  43.    "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  44.    String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
  45.    As Long, lpcbData As Long) As Long
  46.   Declare Function RegSetValueExString Lib "advapi32.dll" Alias _
  47.    "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
  48.    ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As _
  49.    String, ByVal cbData As Long) As Long
  50.   Declare Function RegSetValueExLong Lib "advapi32.dll" Alias _
  51.    "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
  52.    ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, _
  53.    ByVal cbData As Long) As Long
  54. ''''''''''''''''''''
  55. '主函数
  56. Sub main()
  57. MsgBox "XLS文件的默认打开程序为:" & vbCrLf & GetProNameByType("XLS")
  58. End Sub


  59. Function GetProNameByType(strFileType As String) As String
  60.     Dim strTemp As String
  61.    
  62.     strFileType = "." & strFileType
  63.     strTemp = QueryValue(strFileType, "")
  64.     strTemp = strTemp & "\shell\Open\command"
  65.     strTemp = QueryValue(strTemp, "")
  66.     strTemp = Replace(strTemp, Chr(34), "")
  67.     strTemp = LCase(strTemp)
  68.     If InStr(strTemp, ".exe") > 0 Then
  69.         GetProNameByType = Split(strTemp, ".exe")(0) & ".exe"
  70.     Else
  71.         GetProNameByType = ""
  72.     End If
  73. End Function
  74. Private Function QueryValue(sKeyName As String, sValueName As String) As Variant
  75.     Dim lRetVal As Long      'API函数的结果
  76.     Dim hKey As Long         '打开的键的句柄
  77.     Dim vValue As Variant      '查询的值的设置
  78.     lRetVal = RegOpenKeyEx(HKEY_CLASSES_ROOT, sKeyName, 0, KEY_QUERY_VALUE, hKey)
  79.     lRetVal = QueryValueEx(hKey, sValueName, vValue)
  80.    
  81.     QueryValue = vValue
  82.     RegCloseKey (hKey)
  83. End Function
  84. Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As _
  85.    String, vValue As Variant) As Long
  86.     Dim cch As Long
  87.     Dim lrc As Long
  88.     Dim lType As Long
  89.     Dim lValue As Long
  90.     Dim sValue As String
  91.     On Error GoTo QueryValueExError
  92.     ' 确定读取的数据类型和大小
  93.     lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
  94.     If lrc <> ERROR_NONE Then Error 5
  95.     Select Case lType
  96.         ' 字符串
  97.         Case REG_SZ:
  98.             sValue = String(cch, 0)
  99.             lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, _
  100.                    sValue, cch)
  101.             If lrc = ERROR_NONE Then
  102.                    vValue = Left$(sValue, cch - 1)
  103.             Else
  104.                    vValue = Empty
  105.             End If
  106.         ' DWORDS
  107.         Case REG_DWORD:
  108.             lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, _
  109.                  lValue, cch)
  110.             If lrc = ERROR_NONE Then vValue = lValue
  111.         Case Else
  112.             '所有不支持的其它数据类型
  113.             lrc = -1
  114.     End Select
  115. QueryValueExExit:
  116.     QueryValueEx = lrc
  117.     Exit Function
  118. QueryValueExError:
  119.      Resume QueryValueExExit
  120. End Function

复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-7-15 16:25 | 显示全部楼层
郁闷,发了二次贴,都被移动到了回收站,只好再发
分二步,全部是注册表操作:
1.读取后缀名对应的键值
2.根据键值,读取打开的程序名
附件: 注册表.rar (14.13 KB, 下载次数: 3)

TA的精华主题

TA的得分主题

发表于 2013-7-15 16:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
越想越郁闷,哈,被防火墙乱杀了,代码分两部分,看看能不能发:
一、API声明
  1. Option Explicit
  2.   Public Const REG_SZ As Long = 1
  3.   Public Const REG_DWORD As Long = 4

  4.   Public Const HKEY_CLASSES_ROOT = &H80000000
  5.   Public Const HKEY_CURRENT_USER = &H80000001
  6.   Public Const HKEY_LOCAL_MACHINE = &H80000002
  7.   Public Const HKEY_USERS = &H80000003

  8.   Public Const ERROR_NONE = 0
  9.   Public Const ERROR_BADDB = 1
  10.   Public Const ERROR_BADKEY = 2
  11.   Public Const ERROR_CANTOPEN = 3
  12.   Public Const ERROR_CANTREAD = 4
  13.   Public Const ERROR_CANTWRITE = 5
  14.   Public Const ERROR_OUTOFMEMORY = 6
  15.   Public Const ERROR_ARENA_TRASHED = 7
  16.   Public Const ERROR_ACCESS_DENIED = 8
  17.   Public Const ERROR_INVALID_PARAMETERS = 87
  18.   Public Const ERROR_NO_MORE_ITEMS = 259

  19.   Public Const KEY_QUERY_VALUE = &H1
  20.   Public Const KEY_SET_VALUE = &H2
  21.   Public Const KEY_ALL_ACCESS = &H3F

  22.   Public Const REG_OPTION_NON_VOLATILE = 0

  23.   Declare Function RegCloseKey Lib "advapi32.dll" _
  24.    (ByVal hKey As Long) As Long
  25.   Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias _
  26.    "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
  27.    ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions _
  28.    As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes _
  29.    As Long, phkResult As Long, lpdwDisposition As Long) As Long
  30.   Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias _
  31.    "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
  32.    ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As _
  33.    Long) As Long
  34.   Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
  35.    "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  36.    String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
  37.    As String, lpcbData As Long) As Long
  38.   Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _
  39.    "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  40.    String, ByVal lpReserved As Long, lpType As Long, lpData As _
  41.    Long, lpcbData As Long) As Long
  42.   Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _
  43.    "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  44.    String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
  45.    As Long, lpcbData As Long) As Long
  46.   Declare Function RegSetValueExString Lib "advapi32.dll" Alias _
  47.    "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
  48.    ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As _
  49.    String, ByVal cbData As Long) As Long
  50.   Declare Function RegSetValueExLong Lib "advapi32.dll" Alias _
  51.    "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
  52.    ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, _
  53.    ByVal cbData As Long) As Long
复制代码

点评

是被系统误删除了,已恢复。  发表于 2013-7-15 21:17

TA的精华主题

TA的得分主题

发表于 2013-7-15 23:30 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-16 14:43 | 显示全部楼层
liucqa 发表于 2013-7-15 23:30
FindExecutableW

用这个API可以获得执行程序的全路径

能否给个用法的例子啊?谢谢了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-8 09:32 , Processed in 0.041839 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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