0

编辑:我并不是要把这个问题钉在一个特定的可执行文件上。我希望这适用于任何可执行文件。如果我要在运行对话框中输入 FileName,结果是“Windows 找不到 ...”对话框,那么我不想启动该过程。下面更新...

我想在我的程序中执行“可执行文件”,但如果用户没有安装可执行文件,我想运行另一个进程。如何在实际启动 visio 安装在系统上的 visio 进程之前检查?我不想弹出“Windows 找不到”可执行文件“...

这是我的代码。但这确实会弹出“Windows 找不到“可执行文件”..”错误。

System.Diagnostics.Process myProc = new System.Diagnostics.Process();
myProc.StartInfo.FileName = "an executable.exe";
myProc.StartInfo.Arguments = "MyDoc.txt";
myProc.StartInfo.WorkingDirectory = "C:\MyFolder";

try
{
    if( !myProc.Start() )
    {
        myProc.StartInfo.FileName = "another process.exe";
        myProc.Start();
    }
}
catch (Exception ex)
{
    ...
}
4

4 回答 4

2

我会在注册表中查找 HKEY_CLASSES_ROOT\Visio.Application 。如果不存在,则不安装。如果它确实存在,CurVer 子键会给你类似 Visio.Application.12 告诉你安装的默认版本(可能是其他版本)

HKEY_CLASSES_ROOT\Visio.Application.12 Sub Key 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 /自动化

您还可以查看此 API 以及GetBinaryType Function (Windows)

如果您知道应该安装程序的实际文件路径,您还可以进行以下检查

好吧,如果您想查看某个程序是否存在于您要查找的位置(例如 Visio.exe),您可以调用:

System.IO.File.Exists("path_to_program.exe");

如果它返回 true,那么您知道您的程序存在并且您可以使用您的流程运行程序代码运行它。如果它返回 false,那么您知道它不存在并且您不应该启动您的进程。

于 2012-11-20T18:23:18.440 回答
1

首先要做的是在计算机上找到 visio.exe。这可能意味着从注册表中读取安装位置,然后验证该位置是否存在 visio.exe。如果找不到正确的注册表项或文件不存在,则可以合理地假设未安装 Visio。

于 2012-11-20T18:20:29.527 回答
1

tldr; 其他原因导致“Windows 找不到 ..”对话框- 异常处理代码是什么样的?

在没有 Visio 的系统上,代码

System.Diagnostics.Process myProc = new System.Diagnostics.Process();
myProc.StartInfo.FileName = "visio.exe";
myProc.StartInfo.Arguments = "MyVisioDoc.vsd";
myProc.StartInfo.WorkingDirectory = "C:\\MyVisioFolder"; // fixed literal
myProc.Start();

导致抛出有用的异常

Win32Exception: 系统找不到指定的文件

虽然这将导致 Visio 在找到时运行,但如果未找到 Visio,则显示对话框消息框没有内在原因。这不是正常的行为。

现在,如果MyVisioDoc.vsd直接通过(例如使用Open Verb)启动,那么是的,这将传递给 Windows 系统,并且如果.vsd文件与丢失的 Visio 应用程序相关联,则可能会导致这样的对话框。但是,这是与本文中介绍的情况不同的情况。

于 2012-11-20T18:35:18.963 回答
0

您可以在注册表中检查这一点。

试试这个代码:

  public static class ProgramHelper
    {
        public static bool IsProgramInstalled(string displayName, bool x86Platform)
        {
            string uninstallKey = x86Platform
                                      ? @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
                                      : @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";

            using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(uninstallKey))
            {
                if(rk != null)
                    foreach (string skName in rk.GetSubKeyNames())
                    {
                        using (RegistryKey sk = rk.OpenSubKey(skName))
                        {
                            if (sk != null && sk.GetValue("DisplayName") != null &&
                                sk.GetValue("DisplayName").ToString().ToUpper().Equals(displayName.ToUpper()))
                            {
                                return true;
                            }

                        }
                    }
            }
            return false;
        }
    }

您可以像这样调用它:

ProgramHelper.IsProgramInstalled("Microsoft Visio Standard 2010", true);
ProgramHelper.IsProgramInstalled("Microsoft Visio Premium 2010", true);
于 2012-11-20T18:32:28.210 回答