tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルMutex使用時にExcelのプロセスが終了しない
記事No6489
投稿日: 2007/11/05(Mon) 11:10
投稿者むなり
Mutex コンストラクタ を使用してアプリケーションの2重起動を防止する
http://hanatyan.sakura.ne.jp/dotnet/App04.htm

上記を使用し、二重起動を防止しているアプリにて、
Excel.Applicationを扱うと、アプリを終了してもExcelのプロセスが終了しません。
下記がそのプログラム内容になります。

この2重起動防止の部分をコメントアウトすると、
アプリ終了時に、Excelのプロセスが終了します。

どの部分に問題あるかご助言頂けないでしょうか。

---プログラム、ここから先---

Private Sub Form1_Load(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs) Handles MyBase.Load
    'Mutex コンストラクタ
    'ミューテックスの名前を表す文字列を使用して、
    'Mutex クラスの新しいインスタンスを初期化します。
    Dim mt As New System.Threading.Mutex( _
                            False, Process.GetCurrentProcess.ProcessName)
    'WaitHandle.WaitOne メソッド
    '現在の WaitHandle がシグナルを受信するまで現在のスレッドをブロックします
    If mt.WaitOne(0, False) = False Then
        MessageBox.Show("同じアプリがすでに起動しています")
        mt.Close()
        Me.Close()
    End If
End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click
        Dim xlApp As Microsoft.Office.Interop.Excel.Application
        Dim xlWb As Microsoft.Office.Interop.Excel.Workbook
        Dim xlWs As Microsoft.Office.Interop.Excel.Worksheet

        xlApp = New Microsoft.Office.Interop.Excel.Application
        xlWb = xlApp.Workbooks.Add
        xlWs = xlWb.Worksheets("Sheet1")

        xlWs = Nothing
        xlWb.Close(False)
        xlWb = Nothing
        xlApp.Quit()
        xlApp = Nothing

    End Sub

[ツリー表示へ]
タイトルRe: Mutex使用時にExcelのプロセスが終了しない
記事No6490
投稿日: 2007/11/05(Mon) 11:41
投稿者むなり
上記Mutexでの二重起動防止スクリプトを、
「GetProcessesByName メソッドを使用して・・」のものに変更した場合でも、
同様に、Excelのプロセスが残ってしまいます。

[ツリー表示へ]
タイトルRe^2: Mutex使用時にExcelのプロセスが終了しない
記事No6491
投稿日: 2007/11/05(Mon) 11:43
投稿者花ちゃん
ここのTips集のExcel関係をご覧ください。
又、過去ログを調べても色々見つかりますよ。

[ツリー表示へ]
タイトルRe^3: Mutex使用時にExcelのプロセスが終了しない
記事No6492
投稿日: 2007/11/05(Mon) 11:56
投稿者むなり
ReleaseComObjectでの解放・・ということですか?

この2重起動防止部分をコメントアウトするとExcelのプロセスが終了するので、
ReleaseComObjectでの解放とはまた別問題なのかな?と思っているのですが。
見当違いでしたらすみません。

[ツリー表示へ]
タイトルRe^4: Mutex使用時にExcelのプロセスが終了しない
記事No6494
投稿日: 2007/11/05(Mon) 13:33
投稿者魔界の仮面弁士
> ReleaseComObjectでの解放とはまた別問題なのかな?と思っているのですが。

少なくとも、
>> xlWb = xlApp.Workbooks.Add
の部分と、
>> xlWs = xlWb.Worksheets("Sheet1")
の部分は、解放処理の問題を抱えていますよね。

Mutex の問題に取り掛かる前に、まずはこれらを直してからでないと、
問題の切り分けができないので、問題の解決が長引いてしまいますよ。

[ツリー表示へ]
タイトルRe^5: Mutex使用時にExcelのプロセスが終了しない
記事No6495
投稿日: 2007/11/05(Mon) 13:41
投稿者むなり
Sub 〜 End Subの間で、下記のようにReleaseComObjectを使用
--------
        Dim xlApp As Microsoft.Office.Interop.Excel.Application
        Dim xlWbs As Microsoft.Office.Interop.Excel.Workbooks
        Dim xlWb As Microsoft.Office.Interop.Excel.Workbook
        Dim xlWss As Microsoft.Office.Interop.Excel.Sheets
        Dim xlWs As Microsoft.Office.Interop.Excel.Worksheet

        xlApp = New Microsoft.Office.Interop.Excel.Application
        xlWbs = xlApp.Workbooks
        xlWb = xlWbs.Add
        xlWss = xlWb.Worksheets
        xlWs = xlWss.Item(1)

        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWs)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWss)
        xlWs = Nothing
        xlWss = Nothing
        xlWb.Close(False)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWb)
        xlWb = Nothing
        xlWbs.Close()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWbs)
        xlWbs = Nothing
        xlApp.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
        xlApp = Nothing
---------
これにより、Mutexの二重起動防止のスクリプトを含んでいても、
プロセスが終了するようになりました。

一番最初のスクリプトで、二重起動防止を使用してない場合にプロセスが終了するのは、
終了しているように見えてるだけ・・なんでしょうか。
どこか見えない部分で不都合が残ったままとなるのでしょうか・・。

二重起動防止のスクリプトを入れるまで気付かなかった部分ですので、
今まで私が作ったスクリプトも問題ないようにみえてるため、見直しが必要ですね・・。
(特にReleaseComObjectを使用してませんでしたが・・)

[ツリー表示へ]