Shell起動でインスタンスが残る?


たか  2006-02-24 02:48:14  No: 130369

win2000,vb6.0
1.1つの画面から帳票のExe(別Exe)をShell起動で2つ呼び出しています。
2.1回目のShell起動で2つのExeが起動されます。(閉じないまま)
3.再度Exeを起動したときにプロセスを閉じています。(タスクにも残っていません)
    そしてShell起動を行うと帳票側のExeの多重起動(App.PrevInstance)のチェックで
    インスタンスが残っているとエラーになってしまいます。

どのようにしたら回避できるでしょうか?よろしくおねがいします。


魔界の仮面弁士  2006-02-24 06:41:29  No: 130370

> 1.1つの画面から帳票のExe(別Exe)をShell起動で2つ呼び出しています。
この時点で、画面.EXE、帳票A.EXE、帳票B.EXEの、3つの exe が
同時に 1 つずつ起動している状態にある…という理解でよろしいですか?

> 再度Exeを起動したときにプロセスを閉じています
再度Exeを起動したときには、
どのEXEのプロセスを、どのように閉じているのですか?

> インスタンスが残っているとエラーになってしまいます。
それは、どのようなエラーですか?

> (App.PrevInstance)のチェックで

App.PrevInstance の値は、たとえば

-------
  Private Sub Command1_Click()
    MsgBox App.PrevInstance
  End Sub

  1. PROJECT1.EXE を起動(これをAとする)
  2. A にて、App.PrevInstance をチェック → False
  3. PROJECT1.EXE を起動(これはBとする)
  4. A にて、App.PrevInstance をチェック → Falseのまま
  5. B にて、App.PrevInstance をチェック → True
  6. A を終了する。
  7. B で、App.PrevInstance をチェック → Trueのまま
  8. PROJECT1.EXE を起動(これはCとなる)
  9. C にて、App.PrevInstance をチェック → False
-------

のようになるはずですが、その「インスタンスが残っている?」という
状態になる事で、上記とは異なる動作をしてしまう…という事でしょうか?


魔界の仮面弁士  2006-02-24 06:46:51  No: 130371

# B の終了が抜けてました…。

> 8. PROJECT1.EXE を起動(これはCとなる)
        ↓  [訂正]
  8. B を終了し、新たに PROJECT1.EXE を起動(これをCとする)


たか  2006-02-24 18:25:35  No: 130372

回答ありがとうございます。

>> 1.1つの画面から帳票のExe(別Exe)をShell起動で2つ呼び出しています。
>この時点で、画面.EXE、帳票A.EXE、帳票B.EXEの、3つの exe が
 同時に 1 つずつ起動している状態にある…という理解でよろしいですか?
はい、その通りです。

>> 再度Exeを起動したときにプロセスを閉じています
>再度Exeを起動したときには、
 どのEXEのプロセスを、どのように閉じているのですか?
帳票A.EXE、帳票B.EXEを連続で閉じています。
実際には、
-------------
If pstrShellprs <> "" Then
  hProcess = OpenProcess(SYNCHRONIZE Or PROCESS_TERMINATE, True, pstrShellprs)
  Call TerminateProcess(hProcess, 0&)
  Call CloseHandle(hProcess)
End If
If pstrShellprs2 <> "" Then
  hProcess2 = OpenProcess(SYNCHRONIZE Or PROCESS_TERMINATE, True, pstrShellprs2)
  Call TerminateProcess(hProcess2, 0&)
  Call CloseHandle(hProcess2)
End If



for wi_Cnt to 2
  If wi_Cnt = 1 Then
    pstrShellprs = Shell(ws_Exec, vbNormalFocus)
  ElseIf wi_Cnt = 2 Then
    pstrShellprs2 = Shell(ws_Exec, vbNormalFocus)
  EndIf
next
-----------------

>> インスタンスが残っているとエラーになってしまいます。
>それは、どのようなエラーですか?
既に起動されているとApp.PrevInstanceで判断されてしまいます。

>> (App.PrevInstance)のチェックで
>App.PrevInstance の値は、たとえば
1. PROJECT1.EXE を起動(これをAとする)
2. A にて、App.PrevInstance をチェック → False
3. PROJECT2.EXE を起動(これはBとする)
4. B にて、App.PrevInstance をチェック → False
5. A を終了する。
6. B を終了する。
7. A を起動する。
8. A で、App.PrevInstance をチェック → True

8.にてTrueになってしまうのでその後の動作も思っている通りになりません。

これからまた、調べていきますが何かアドバイスなどでもあれば宜しくお願いします。

> インスタンスが残っているとエラーになってしまいます。
それは、どのようなエラーですか?

> (App.PrevInstance)のチェックで

App.PrevInstance の値は、たとえば

-------
  Private Sub Command1_Click()
    MsgBox App.PrevInstance
  End Sub

  1. PROJECT1.EXE を起動(これをAとする)
  2. A にて、App.PrevInstance をチェック → False
  3. PROJECT1.EXE を起動(これはBとする)
  4. A にて、App.PrevInstance をチェック → Falseのまま
  5. B にて、App.PrevInstance をチェック → True
  6. A を終了する。
  7. B で、App.PrevInstance をチェック → Trueのまま
  8. PROJECT1.EXE を起動(これはCとなる)
  9. C にて、App.PrevInstance をチェック → False
-------


たか  2006-02-24 18:30:27  No: 130373

すいません  追記です。
この処理は印刷ボタンの押下時の処理で、
押されるたびにこの処理が流れます。

回答をコピーしたものを途中から削除するのを忘れていました。
見にくくなってすいません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加