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のようなものを提供します。これは、インストールされているDEFAULTバージョンを示します(他の場合もあります)。

HKEY_CLASSES_ROOT \ Visio.Application.12サブキーCLSIDは、GUIDを提供します:{00021A20-0000-0000-C000-000000000046}

HKEY_CLASSES_ROOT \ CLSID {00021A20-0000-0000-C000-000000000046}は、EXEへのパスを含むサブキー「LocalServer32」を提供します。

C:\ PROGRA〜1 \ MICROS〜4 \ Office12 \ VISIO.EXE / Automation

このAPIもチェックアウトできますGetBinaryTypeFunction(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 に答える