none
二重起動 RRS feed

  • 質問

  • VB6で作成したActiveXアプリを起動して、ファイル読み込み操作を実行した後、タスクを終了します。
    そして、アプリを再起動すると二重起動エラーになりアプリが使用できません。

    Mutexオブジェクトを作成して、エラーがあれば作成したオブジェクトをCloseHandle処理はしています。

    対策を教えていただけませんか?

    2012年11月13日 10:02

回答

  • >> 1.
    >> デバッカーでファイル読み込みのActiveXアプリを起動してます。
    >> ここで、アプリがアドインしているIEを閉じます。
    >> そして、再度、IEタスクが無いの確認してアプリを起動すると二重起動になります。
    >> これも開放されていないオブジェクトがあると言うことですか?

    んー・・・VB6のアプリからIEを起動しているのか、IEのアドオンをVB6で作っているのかいまいちよく分かりませんが・・・
    まぁデバッガで起動できるということですので、前者だと仮定して回答します。
    まず、IEのタスクが終了しているのはどこで確認されたのでしょうか?
    タスクバーから消えている・タスクマネージャのアプリケーションタブに無い、では終了は確認できません。
    タスクマネージャのプロセスタブに「iexplore.exe」が無いか確認して下さい。
    (ただまぁIEのプロセスは関係無いと思いますが・・・)

    >> デバッカーを終了して、再度、立ち上げるて、IEタスクが無いの確認してアプリを起動するとエラーは起こりません。

    デバッガを終了するとデバッガがホストしていたプロセスが終了=強制解放されますので、当然二重起動にはなりません。

    >> 2.
    >> オブジェクトのクロースはSETで指定して、Nothingを代入すれば良いのでしょうか?
    >> まとめてオブジェクトをクロースするステーメントはございますか?

    とりあえず下記にVB6での代表的なファイル操作処理のサンプルを書いてみました。

    Private Sub Command1_Click()
        Dim fileNo As Integer
        fileNo = FreeFile
        
        'ファイルOpen
        Open "C:\WUTemp\Sample.txt" For Input As #fileNo
        
        '(※読み込み処理)    
            
        'Close処理
        Close #fileNo
    End Sub
    
    Private Sub Command2_Click()
        Dim fileSys As New FileSystemObject
        
        'ファイルOpen
        Dim stream As TextStream
        Set stream = fileSys.OpenTextFile("C:\WUTemp\Sample.txt", ForReading, False)
        
        '(※読み込み処理)    
        
        'Close処理
        stream.Close
    
        Set stream = Nothing
        Set fileSys = Nothing
    End Sub
    

    どちらの方法でファイル操作を行っているのかわかりませんが、ご自分で書かれた部分と見比べて、Close処理がちゃんと入っているか確認してみて下さい。
    • 回答としてマーク Umashika 2012年11月14日 6:31
    2012年11月13日 13:42

すべての返信

  • 実際にどういうコードを書いたのか分からないので、文面から推測で回答します。

    アプリを終了したのに二重起動になるのであれば、フォームが閉じただけでプロセスは解放されていないということです。
    で、プロセスが解放されない原因ですが、一番考えられるのはファイル読み込みをしているということですので、ファイルをOpenした後、処理終了後にCloseしているかどうか確認して下さい。
    FileSystemObjectにしてもOpenステートメントにしても、きちんとCloseしないとプロセスが解放されません。

    2012年11月13日 10:57
  • 申し訳ございません。
    質問させてください。

    1.
    デバッカーでファイル読み込みのActiveXアプリを起動してます。
    ここで、アプリがアドインしているIEを閉じます。
    そして、再度、IEタスクが無いの確認してアプリを起動すると二重起動になります。
    これも開放されていないオブジェクトがあると言うことですか?
    デバッカーを終了して、再度、立ち上げるて、IEタスクが無いの確認してアプリを起動するとエラーは起こりません。

    2.
    オブジェクトのクロースはSETで指定して、Nothingを代入すれば良いのでしょうか?
    まとめてオブジェクトをクロースするステーメントはございますか?

    2012年11月13日 12:21
  • >> 1.
    >> デバッカーでファイル読み込みのActiveXアプリを起動してます。
    >> ここで、アプリがアドインしているIEを閉じます。
    >> そして、再度、IEタスクが無いの確認してアプリを起動すると二重起動になります。
    >> これも開放されていないオブジェクトがあると言うことですか?

    んー・・・VB6のアプリからIEを起動しているのか、IEのアドオンをVB6で作っているのかいまいちよく分かりませんが・・・
    まぁデバッガで起動できるということですので、前者だと仮定して回答します。
    まず、IEのタスクが終了しているのはどこで確認されたのでしょうか?
    タスクバーから消えている・タスクマネージャのアプリケーションタブに無い、では終了は確認できません。
    タスクマネージャのプロセスタブに「iexplore.exe」が無いか確認して下さい。
    (ただまぁIEのプロセスは関係無いと思いますが・・・)

    >> デバッカーを終了して、再度、立ち上げるて、IEタスクが無いの確認してアプリを起動するとエラーは起こりません。

    デバッガを終了するとデバッガがホストしていたプロセスが終了=強制解放されますので、当然二重起動にはなりません。

    >> 2.
    >> オブジェクトのクロースはSETで指定して、Nothingを代入すれば良いのでしょうか?
    >> まとめてオブジェクトをクロースするステーメントはございますか?

    とりあえず下記にVB6での代表的なファイル操作処理のサンプルを書いてみました。

    Private Sub Command1_Click()
        Dim fileNo As Integer
        fileNo = FreeFile
        
        'ファイルOpen
        Open "C:\WUTemp\Sample.txt" For Input As #fileNo
        
        '(※読み込み処理)    
            
        'Close処理
        Close #fileNo
    End Sub
    
    Private Sub Command2_Click()
        Dim fileSys As New FileSystemObject
        
        'ファイルOpen
        Dim stream As TextStream
        Set stream = fileSys.OpenTextFile("C:\WUTemp\Sample.txt", ForReading, False)
        
        '(※読み込み処理)    
        
        'Close処理
        stream.Close
    
        Set stream = Nothing
        Set fileSys = Nothing
    End Sub
    

    どちらの方法でファイル操作を行っているのかわかりませんが、ご自分で書かれた部分と見比べて、Close処理がちゃんと入っているか確認してみて下さい。
    • 回答としてマーク Umashika 2012年11月14日 6:31
    2012年11月13日 13:42
  • VB6 の ActiveX EXE というと、アウトプロセス COM という認識で合っていますか。
    それを、IE などでオブジェクトを呼び出しているのでしょうか。

    Excel などもアウトプロセス COM ですが、きちんとオブジェクトを解放しないとプロセスが残るという問題が有名です。
    今回の VB6 の ActiveX EXE もタスクマネージャーのプロセスタブを見ると、生き残っているのではないでしょうか。

    生き残っているとすれば、解放処理が必要です。
    どのような ActiveX EXE を作っているか、どのように利用しているかが見えないので、具体的なことは何とも言えませんが。

    2012年11月13日 13:44
    モデレータ