7.同期処理−2(アプリケーション)



< 使用用途 >
プログラム内で別のアプリケーション(プログラム)を呼び出す事が出来、そのプログラムが終了
されるまで呼び出した側のプログラムの処理を一時的に中断します。

今回のサンプルソースをダウンロードする方は下記の「ダウンロード」を!
=> ダウンロード・・・ サンプルソースは電卓(内容は同じ)です


< 説明 >
別のプログラムを呼び出す時はSHELL関数(詳細は「VBの技術メモのページ」を参照)を使います。
API関数のOpenProcess、GetExitCodeProcessを使用して呼び出したアプリケーションが終了するまで待機させます。

GetExitCodeProcess =>指定したアプリケーションのプロセスの終了の値を取得する
  <引数> 
    hProcess :プロセスのハンドル
    lpExitCode : 終了の値が入いる変数
  @戻り値@  
    正常終了のとき : 0 以外
    エラーのとき   : 0

OpenProcess =>既存(動作しているアプリケーション)のプロセスオブジェクトのハンドルを返す
 
<引数>
    dwDesiredAccess& : アクセス方法を示す変数
    bInheritHandle&   : 1 のときカレントプロセスを継承する
    dwProcessId      : プロセス ID
 @戻り値@
    正常終了のとき : プロセスのハンドル
    エラーのとき    : 0


< SAMPLE >
'標準モジュールに宣言して下さい
Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal PROCESS As Long, lpExitCode As Long) As Long

'ここから下はフォームのエリアです
’サンプルではフォームにあるコマンドボタンを押した時の処理です
Private Sub Command1_Click()
   Dim INST     As Long
   Dim PROCESS As Long
   Dim MODORITI As Long
   Dim ENDWORK As Long


' システムエディタを起動
   INST = Shell("SYSEDIT.EXE", 2)

'システムエディタのプロセスを取得する
   PROCESS = OpenProcess(1024 Or 1048576, True, INST)

'システムエディタが閉じられるまで処理を中断(ループさせる)
   Do While 1
      MODORITI = GetExitCodeProcess(PROCESS, ENDWORK)
      ’システムエディタが終了したら処理中断(ループ)を解除する
      If ENDWORK <> 259 Then
         MsgBox "shori  end"
         Exit Do
      End If
   Loop

END SUB





API 技術関連のページへ戻る

ホーム PV ランキング