tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルExcelプロセス終了しない
記事No15280
投稿日: 2011/07/28(Thu) 11:23
投稿者yana
VB6.0で作ったアプリでExcel2003ファイルを開く処理ですが、Excel2010ファイルを開くとExcelプロセスが終了しない現象が起き、Excel2010ファイルを開けなくなる。
OS:Windows7
問題の箇所は以下のソースコードにある。
Public Sub ShellEnd(ProcessID As Long)
    Dim hProcess As Long
    Dim EndCode As Long
    Dim EndRet   As Long
    'ハンドルを取得する
     hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, ProcessID)
    '終わるまで待つ
    Do
        EndRet = GetExitCodeProcess(hProcess, EndCode)
        DoEvents
    Loop While (EndCode = STILL_ACTIVE)
    'ハンドルを閉じる
     EndRet = CloseHandle(hProcess)
End Sub
ぜひ、よろしくお願いします。

[ツリー表示へ]
タイトルRe: Excelプロセス終了しない
記事No15282
投稿日: 2011/07/28(Thu) 17:34
投稿者たぁ
> 問題の箇所は以下のソースコードにある。
>     '終わるまで待つ
>     Do
>         EndRet = GetExitCodeProcess(hProcess, EndCode)
>         DoEvents
>     Loop While (EndCode = STILL_ACTIVE)

問題の箇所というのは、このループから抜けないということでしょうか?
あまり詳しくないのでよくわかりませんが、このソースだとプロセスが終了していない
のを監視してることしか判断がつかないと思いますが。
EXCELのオブジェクトがどう扱われてるのか判断できる材料がないと、回答は難しいと
思われます。
私は素人と大して変わらない知識しか持っていませんので、もしかしたら待って入れば、
有識者の方が回答してくれるのかもしれませんが・・・。

[ツリー表示へ]
タイトルRe: Excelプロセス終了しない
記事No15283
投稿日: 2011/07/29(Fri) 00:43
投稿者Koz
提示されたコードのように、GetExitCodeProcess の終了コードが
STILL_ACTIVE 以外になるまで DoEvents で廻り続けるというのは
Win95, 98, Me などの 9x 系OS でのコーディングスタイルです。

Sleep 等を入れないと、CPU リソースを消費しまくります。

NT 系の OS ならば、OpenProcess の第1引数に SYNCHRONIZE を指定し
待機ハンドルを取得して、MsgWaitForMultipleObjects 等の待機関数で
終了を待つべきかと思います。

簡単にやるなら、WScript.Shell オブジェクトの Run メソッドもあります。

おそらく、CPU リソースを消費することで、Excel の処理が進まない
だけではないでしょうか。

[ツリー表示へ]