如何枚举所有可以打开XML文件作为纯文本的程序?

时间:2015-07-23 18:58:05

标签: xml excel excel-vba registry vba

我正在处理一些代码,这些代码将从SQL数据库导入一些XML。

有时我想使用.xmlImportxml方法将其导入 Excel ,有时我只想在文本编辑器中打开它。

我在框架内设置了2个选项按钮,并带有复选框。该复选框确定我是要导入还是仅查看XML文件。 2个选项是使用文本编辑器或使用ShellExecute API使用系统默认值。我不太喜欢这个选项,因为它通常是 Internet Explorer 。它看起来不错,但你无法编辑文件。

我想要做的是枚举可用于查看系统上的平面文本文件的所有程序。我想将它们全部添加到框架内的组合框中。我以前只用 Notepad 使用shell进行硬编码来启动它,但现在我使用 Notepad ++ 并且我希望可以选择在没有硬编码的情况下使用它任何东西。有些用户使用 TextPad ,有些使用 UltraEdit ,有些使用写字板等等。我可以编写所有我能想到的但我和#39; d而不是动态枚举它们。

我已经通过注册表进行了检查,但那里没有任何一致性。我可以用:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt\OpenWithList

找到列表,但我找不到从中获取路径的好方法。

如何获取OpenWithList.txt文件中找到的所有可执行文件的路径?

还是有更好的方法可以找出安装哪些应用程序(文本编辑器)来查看和编辑XML文件的文本文件?

1 个答案:

答案 0 :(得分:2)

确实很难找出哪些已安装的应用程序适合编辑XML文件,即文本编辑器。

通过Windows资源管理器管理的OpenWithList列表自动评估.txt FileExts是一个好主意。但是这个列表只包含没有路径的可执行文件的文件名。

可以从以下位置读取具有完整路径的可执行文件:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths

在Windows x64上还有:

HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths

这些注册表项包含已安装的应用程序列表。每个可执行文件都有一个低于App Paths的密钥。每个应用程序密钥的默认字符串是具有完整路径的可执行文件的文件名。通常也存在的Path字符串是可选的,因此并不总是存在。

定期安装的所有应用程序都列在App Paths下,记事本除外。但 Notepad 始终存在于Windows %windir%目录%SystemRoot%中。因此,通过获取环境变量 windir SystemRoot 的值,可以通过代码轻松确定记事本的完整文件名。

App Paths下未列出的唯一应用程序是那些刚刚复制到硬盘或从存档文件中提取而未运行安装程序的应用程序。但是文本编辑器通常与安装程序一起安装,而不是通过将文本编辑器的所有程序文件复制或解压缩到目录。

根据Microsoft文章Registry Keys Affected by WOW64,自Windows 7和Windows Server 2008 R2

Microsoft\Windows\CurrentVersion\App Paths 共享。这意味着两个注册表路径具有相同的数据库。因此,在两个App Paths中的任何一个中进行的每个修改都会自动立即在另一个路径上可见。从HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths读取适用于x86和x64应用程序。

但是,在x64版本的Windows Server 2008,Windows Vista,Windows Server 2003和Windows XP上,注册表项Microsoft\Windows\CurrentVersion\App Paths只是重定向。这意味着读取HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths的x86应用程序读取仅包含x86应用程序的实际HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths,而x64应用程序实际读取包含x64应用程序的HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths

因此,不容易选择在x64 Windows上用于查找应用程序路径的策略。我建议先在HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths中搜索可执行文件。如果无法在OpenWithList找到HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths的可执行文件名,则应在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths 上进行第二次尝试。在查询/读取访问时,如果计算机运行的是Windows x86,则只会发生 not found

Microsoft文章Application Registration解释了应用程序的注册。因为可以在那里读取,当用户没有管理员权限时,用户也可以仅为当前用户安装应用程序。在这种情况下,应用程序在

下注册
HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths

并且在Windows x64之前的Windows 7和Windows Server 2008 R2上可能仅在

之下
OpenWithList

还应该从App Paths搜索这两个注册表路径以查找可执行文件的名称。

顺便说一下:Windows命令行解释器的命令 start 也使用if($file1.LastWriteTime -gt $file2.LastWriteTime) { } 注册表项来查找要启动的应用程序,请参阅Where is “START” searching for executables?

我建议另外选中一个复选框选项记住我的选择,以便用户只能选择XML文件的首选查看器/编辑器应用程序。如果在记住的目录中仍然存在一次选定的应用程序,则在使用此复选框之前,您的应用程序应在下次打开对话框时预先选择相应的应用程序。

另一个复选框选项可以是始终使用所选应用程序,一旦选中导致下一次自动打开XML文件在一次选择的应用程序中,而不显示对话框以选择查看/编辑的应用程序如果曾经选择的应用程序仍然存在于记忆目录中,则为XML文件。