Home > 即効テクニック > AccessVBA > Windows環境・オブジェクト > 起動したアプリケーションのプロセスオブジェクトのハンドルを取得、解放する

即効テクニック

Windows環境・オブジェクト

起動したアプリケーションのプロセスオブジェクトのハンドルを取得、解放する

(Access 2000/2002/2003)
●概要●
宣言文  Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess
        As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long)
        As Long

設定項目          内容
dwDesiredAccess   アクセス方法を示すフラグとなる定数を組み合わせて指定[省略不可]
bInheritHandle    「1」を指定してカレントプロセスを継承[省略不可]
dwProcessId       プロセスIDを指定[省略不可]

宣言文  Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
        As Long

設定項目          内容
hObject           オブジェクトハンドルを指定[省略不可]

OpenProcess関数では、引数で指定したプロセスIDを元にプロセスオブジェクトのハンドルを返します。失敗時には「0」を返します。プロセスIDにはShell関数の戻り値をそのまま利用できます。
CloseHandle関数は、引数で指定したオブジェクトハンドルを解放します。成功時には「0」以外を、失敗時には「0」を返します。
次のコードは、起動した電卓のプロセスオブジェクトのハンドルをメッセージダイアログで表示するサンプルです。

●サンプル●
Private Declare Function OpenProcess _
    Lib "kernel32" _
    (ByVal dwDesiredAccess As Long _
    , ByVal bInheritHandle As Long _
    , ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle _
    Lib "kernel32" _
    (ByVal hObject As Long) As Long
Private Const PROCESS_QUERY_INFORMATION As Long = &H400

'起動したアプリケーションのプロセスオブジェクトのハンドルを取得、解放する
Sub Sample()
    Dim myId As Long
    Dim myProcess As Long
    '電卓を起動してタスクIDを取得
    myId = CLng(Shell("calc", vbNormalFocus))
    'プロセスオブジェクトのハンドルを取得して表示
    myProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, myId)
    MsgBox myProcess
    'オブジェクトハンドルの解放
    CloseHandle myProcess
End Sub

●補足1●
実行すると、電卓が自動起動され、電卓のプロセスオブジェクトのハンドルがメッセージダイアログに表示されます。

●補足2●
CloseHandle関数で戻り値を必要としない場合には、Subプロシージャとして宣言してもかまいません。

Declare Sub CloseHandle Lib "kernel32" (ByVal hObject As Long)