C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.32692 の関連記事表示

<< 0 >>
■32692  Processクラスでのファイル起動について
□投稿者/ ガチンコ -(2009/02/12(Thu) 19:15:04)

    分類:[C#] 

    お世話になっております。

    以下のコードにて、アプリに関連付けられたファイルを起動しています。

    --------------------------------------------------------
    filenm = "C:\xxxxx\hoge.txt"; や、"C:\xxxxx\hoge.xls" や、その他PDF等

    //指定されたファイルを起動
    Process p = Process.Start(filenm);

    //終了まで待ってから
    p.WaitForExit();

    //hogeメソッドを起動
    hoge();
    --------------------------------------------------------

    そこで、例えばExcelファイルが filenm にセットされている場合に、
    既に他のExcelファイルが起動されていると、そのプロセスを横取りし p が取得できず(null)、
    p.WaitForExit()で落ちてしまいます。

    終了まで待ってからでないと、hoge()メソッドが実行できないので、
    そのプロセスの終了まで待たないといけません。

    常に新しいプロセスで起動したいのですが、
    なにか方法はないでしょうか?

    ご存じの方、よろしくお願いします。
親記事 /過去ログ57より / 関連記事表示
削除チェック/

■32695  Re[1]: Processクラスでのファイル起動について
□投稿者/ ガチンコ -(2009/02/12(Thu) 21:12:15)
    No32692 (ガチンコ さん) に返信
    自己解決しましたので、報告させて頂きます。
    
    常に新しいプロセスで起動させるため、関連付けられたアプリケーションの実行パスを
    Process.Startメソッドに加えることに致しました。
    
    なお、関連付けられたアプリケーションの取得は、
    Win32APIのFindExecutable関数にて取得しました。
    不具合あるらしいけど、今のところ動いてるので大丈夫かな・・。
    もしなにかあったら、レジストリからも取得できるようなので、そちらに変更したいと思います。
    
    ------------------------------------------------------------
    /// <summary>
    /// Win32 API FindExecutable関数
    ///    ファイルに関連付けられた実行ファイルを取得します。
    /// </summary>
    /// <param name="lpFile">ファイル名文字列へのポインタ</param>
    /// <param name="lpDirectory">既定ディレクトリ文字列へのポインタ</param>
    /// <param name="lpResult">返される実行可能ファイル文字列を保持するバッファへのポインタ</param>
    /// <returns></returns>
    [System.Runtime.InteropServices.DllImport("shell32.dll")]
    public static extern int FindExecutable(string lpFile, string lpDirectory, System.Text.StringBuilder lpResult);
    
    〜
    
    //結果を受け取るためのStringBuilderオブジェクト
    StringBuilder exepath = new StringBuilder(256);
    
    //fileNmに関連付けられた実行ファイルのパスを取得する
    if (FindExecutable(filenm, null, exepath ) <= 32)
    {
        return false;  //取得失敗
    }
    
    //指定されたファイルを起動
    using(Process p = Process.Start(exepath.ToString(), filenm))
    {
        //終了まで待ってから
        p.WaitForExit();
    }
    
    //hogeメソッドを起動
    hoge();
    ------------------------------------------------------------
記事No.32692 のレス / END /過去ログ57より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -