作成者カテゴリ 
公開
小林
07/02/1998 09:14 PM
フォーム
ノーツサーバノーツクライアントサーバOSクライアントOSネットワークプロトコル
N/AN/AN/AN/AN/A

WaitForSingleObject??

はじめまして、小林と申します。
いつもお世話になっています。m(__)m
早速なのですが、質問させてください。
#長文ですが、ご容赦ください。

R4.52で、以下のようなスクリプトを実行させたいと思っています。

アクションボタンをクリックしたら、何らかのアプリケーションを起
動し、そのアプリケーションの終了を待ってからスクリプトを続けた
い。

最初、YIELD関数の詳細を参考にしましたがうまくいきませんでした。
Windows 32bitでのAPI関数は GetModuleUsage ではなく、
(CreateProcessと) WaitForSingleObjectを使用しないといけないよ
うです。以下のようにスクリプトを変更してみたのですが、アプリケー
ションが起動してくれません??
何らかの解決方法をご存知でしたら、ご教示願います。m(__)m

=====
(Declarations)

' セキュリティ属性に関する情報を定義する構造体
Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type

' 新しいプロセスのメインウィンドウの表示状態を定義する構造体
Type STARTUPINFO
cb As Long
lpReserved As Long
lpDesktop As Long
lpTitle As Long
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Const STARTF_USESHOWWINDOW = &H1
Const STARTF_USESIZE = &H2
Const STARTF_USEPOSITION = &H4
Const STARTF_USECOUNTCHARS = &H8
Const STARTF_USEFILLATTRIBUTE = &H10
Const STARTF_RUNFULLSCREEN = &H20
Const STARTF_FORCEONFEEDBACK = &H40
Const STARTF_FORCEOFFFEEDBACK = &H80
Const STARTF_USESTDHANDLES = &H100
Const STARTF_USEHOTKEY = &H200
Const SW_HIDE = 0
Const SW_SHOWNORMAL = 1
Const SW_NORMAL = 1
Const SW_SHOWMINIMIZED = 2
Const SW_SHOWMAXIMIZED = 3
Const SW_MAXIMIZE = 3
Const SW_SHOWNOACTIVATE = 4
Const SW_SHOW = 5
Const SW_MINIMIZE = 6
Const SW_SHOWMINNOACTIVE = 7
Const SW_SHOWNA = 8
Const SW_RESTORE = 9
Const SW_SHOWDEFAULT = 10
Const SW_MAX = 10

' 新しいプロセスに関する識別情報を定義する構造体
Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type

' 新しいプロセスとそのプライマリスレッドを作成する関数の宣言
Declare Function CreateProcess Lib "Kernel32" Alias "CreateProcessA" _
(Byval lpApplicationName As String, Byval lpCommandLine As String, _
lpProcessAttributes As SECURITY_ATTRIBUTES, _
lpThreadAttributes As SECURITY_ATTRIBUTES, _
Byval bInheritHandles As Long, _
Byval dwCreationFlags As Long, _
lpEnvironment As Any, _
Byval lpCurrentDriectory As String, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long
Const DEBUG_PROCESS = &H1
Const DEBUG_ONLY_THIS_PROCESS = &H2
Const CREATE_SUSPENDED = &H4
Const DETACHED_PROCESS = &H8
Const CREATE_NEW_CONSOLE = &H10
Const NORMAL_PRIORITY_CLASS = &H20
Const IDLE_PRIORITY_CLASS = &H40
Const HIGH_PRIORITY_CLASS = &H80
Const REALTIME_PRIORITY_CLASS = &H100
Const CREATE_NEW_PROCESS_GROUP = &H200
Const CREATE_UNICODE_ENVIRONMENT = &H400
Const CREATE_SEPARATE_WOW_VDM = &H800
Const CREATE_SHARED_WOW_VDM = &H1000
Const CREATE_DEFAULT_ERROR_MODE = &H4000000
Const CREATE_NO_WINDOW = &H8000000

Declare Function WaitForSingleObject Lib "Kernel32" (Byval hHandle As Long, Byval dwMilliseconds As Long) As Long
Const STATUS_WAIT_0 = &H0
Const STATUS_ABANDONED_WAIT_0 = &H80
Const STATUS_TIMEOUT = &H102
Const WAIT_OBJECT_0 = ((STATUS_WAIT_0) + 0)
Const WAIT_ABANDONED = ((STATUS_ABANDONED_WAIT_0) + 0)
Const WAIT_TIMEOUT = STATUS_TIMEOUT
Const WAIT_FAILED = &HFFFFFFFF

==========

Sub Click(Source As Button)
Dim udtProcessAttributes As SECURITY_ATTRIBUTES
Dim udtThreadAttributes As SECURITY_ATTRIBUTES
Dim udtStartupInfo As STARTUPINFO
Dim udtProcessInfomation As PROCESS_INFORMATION
Dim lngWaitForObjectTimeOut As Long
Dim lngWaitForObjectEvent As Long
Dim lngWin32apiResultCode As Long

'セキュリティ構造体を初期化
'udtProcessAttributes.nLength = Len(udtProcessAttributes)
'udtThreadAttributes.nLength = Len(udtThreadAttributes)

' 新しいプロセスを作成
lngWin32apiResultCode = CreateProcess( "C:\Windows\Notepad.exe", _
Null, _
udtProcessAttributes, _
udtThreadAttributes, _
False, _
0, _
Null, _
Null, _
udtStartupInfo, _
udtProcessInfomation)

' 待機するタイムアウト時間を指定
lngWaitForObjectTimeOut = 60

' 新しいプロセスがシグナル状態になるまで待機
lngWaitForObjectEvent = WaitForSingleObject(udtProcessInfomation.hProcess, lngWaitForObjectTimeOut)

' 待機結果を表示
Select Case lngWaitForObjectEvent
Case STATUS_WAIT_0:
Messagebox "プロセスは終了"
Case WAIT_TIMEOUT:
Messagebox "待機はタイムアウト"
Case WAIT_FAILED:
Messagebox "待機は失敗"
End Select
End Sub


[Previous Main Document]
WaitForSingleObject?? (小林) * 現在地 *
. . 同じことで悩んでいます。。。 (kojima)
. . 他アプリの終了を待って次の処理に移る (N)
[Next Main Document]