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

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

C# と VB.NET の入門サイト

Re[1]: Processクラスでのファイル起動について


(過去ログ 57 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■32692 / inTopicNo.1)  Processクラスでのファイル起動について
  
□投稿者/ ガチンコ (7回)-(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()メソッドが実行できないので、
そのプロセスの終了まで待たないといけません。

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

ご存じの方、よろしくお願いします。

引用返信 編集キー/
■32695 / inTopicNo.2)  Re[1]: Processクラスでのファイル起動について
□投稿者/ ガチンコ (8回)-(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();
------------------------------------------------------------

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -