2009-07-06 147 views
1

我正在构建一个C#应用程序,用于导出要与Visio组织结构图向导一起使用的CSV文件。如何以编程方式检查Visio是否已安装以及在哪里?

如何检查Visio的安装是否存在以及路径是什么?

最明显的方法是检查是否存在C:\Program Files\Office12\ORGWIZ.EXE,但这是相当依赖于具有安装了Visio 2007 ..

我的另一个想法是检查注册表,但什么是最可靠的来源?我HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\那里有版本号看了下,但它们下面是一个Visio\InstallRoot这将是除了检查每个版本完美..

我看别的地方,我可以Software\Microsoft\Windows\CurrentVersion\Uninstall\下检查,卸载信息,但是这看起来相当复杂对于Windows组件...

+0

whereis的Visio ...哦,等一下... – PostMan 2009-07-06 04:05:31

回答

5

我会在注册表中查找 HKEY_CLASSES_ROOT \ Visio.Application。 如果不存在,请勿安装。 如果它确实存在,CURVER子键会给你像Visio.Application.12 ,告诉你所安装的DEFAULT版本(可能是其他人)

HKEY_CLASSES_ROOT \ Visio.Application.12子项CLSID会给你一个GUID: {00021A20-0000-0000-C000-000000000046}

HKEY_CLASSES_ROOT \ CLSID {00021A20-0000-0000-C000-000000000046}反过来会给你 的子键 “LocalServer32” 其中将包含到EXE的路径。

C:\ PROGRA〜1 \ MICROS〜4 \ OFFICE12 \ VISIO.EXE /自动化

正如你所看到的,在我的情况下,它的短路径形式。

1

您可以检查Visio文件扩展名是否已注册,以及应用程序是什么?

http://www.dreamincode.net/code/snippet3159.htm

查找范围HKEY_CLASSES_ROOT\\.vsd,并重点存在,有什么价值?将它们与一组表示应用程序已安装的值进行比较。

+0

是的,关键是有..没有太多的价值观的方式连接它到一个安装 - “PersistentHandler”哈希不匹配注册表中的其他任何东西(我希望它是在卸载信息) – brasskazoo 2009-07-06 03:01:03

3

这里是我的解决方案,基于Roger's答案:

RegistryKey regVersionString = Registry.ClassesRoot.OpenSubKey("Visio.Drawing\\CurVer"); 
    Console.WriteLine("VERSION: " + regVersionString.GetValue("")); 

    RegistryKey regClassId = Registry.ClassesRoot.OpenSubKey(regVersionString.GetValue("") + "\\CLSID"); 
    Console.WriteLine("CLSID: " + regClassId.GetValue("")); 

    RegistryKey regInstallPath = Registry.ClassesRoot.OpenSubKey("CLSID\\" + regClassId.GetValue("") + "\\LocalServer32"); 
    Console.WriteLine("PATH: " + regInstallPath.GetValue("")); 
相关问题