- ベストアンサー
使用しているEXEファイルから、別のEXEファイルをクローズする方法
今現在簡単なプログラムを作成しておりまして、 TEST1.exeとTEST2.exeの二つのプログラムがあります。 TEST1.exeとTEST2.exeの二つのアプリケーションを起動 し、TEST1.exeが終了したら、TEST2.exeのアプリケー ションも自動的に終了するようにしたいのですけど、何か やり方ってありますでしょうか? 作成しているソフトはVB6.0/Win2000Proです。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
CreateProcessプロセスというAPIで起動し TerminateProcessプロセスというAPIで終了させます 以下に例を上げておきます。 'CreateProcess '新しいプロセスを作り、実行ファイルを実行する。 ' 'BOOL CreateProcess( LPCTSTR lpApplicationName, ' // pointer to name of executable module ' ' LPTSTR lpCommandLine, ' // pointer to command line string ' ' LPSECURITY_ATTRIBUTES lpProcessAttributes, ' // pointer to process security attributes ' ' LPSECURITY_ATTRIBUTES lpThreadAttributes, ' // pointer to thread security attributes ' ' BOOL bInheritHandles, ' // handle inheritance flag ' ' DWORD dwCreationFlags, ' // creation flags ' ' LPVOID lpEnvironment, ' // pointer to new environment block ' ' LPCTSTR lpCurrentDirectory, ' // pointer to current directory name ' ' LPSTARTUPINFO lpStartupInfo, ' // pointer to STARTUPINFO ' ' LPPROCESS_INFORMATION lpProcessInformation ' // pointer to PROCESS_INFORMATION ' ' ); ' Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadId As Long End Type Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String 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 Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal _ lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, _ ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, _ lpProcessInformation As PROCESS_INFORMATION) As Long Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwAccess As Long, ByVal fInherit As Integer, ByVal hObject _ As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Const SYNCHRONIZE = 1048576 Const NORMAL_PRIORITY_CLASS = &H20& Dim pInfo As PROCESS_INFORMATION Dim sInfo As STARTUPINFO Dim sNull As String Private Sub Command1_Click() Dim success& success& = CreateProcess(sNull, "Calc.exe", ByVal 0&, ByVal 0&, 1&, NORMAL_PRIORITY_CLASS, ByVal 0&, sNull, sInfo, pInfo) End Sub Private Sub Command2_Click() Dim ret& ret& = TerminateProcess(pInfo.hProcess, 0&) ret& = CloseHandle(pInfo.hThread) ret& = CloseHandle(pInfo.hProcess) End Sub
その他の回答 (2)
- 2ch
- ベストアンサー率51% (64/125)
掲示板に質問する前に、過去スレを調べるべし
お礼
わざわざどうもありがとうございます。 そして、参考URLどうもありがとうございました。 ちなみに、私もアホじゃないんで、調べた上で質問はし ております。 ただ私が行った検索方法では、ヒットしなかっただけの 話です。 似たような質問が繰り返され、気分を害されたのかもし れませんが、私も調べもせずに質問したわけではないので、その辺はご理解いただけたらな。。。と思います。
- sha-girl
- ベストアンサー率52% (430/816)
APIを使わないと無理です。 TerminateProcessというAPIを使えば可能です。 ただ本当に強制終了なので、お勧めはできません。 プログラム次第ではメモリリークが発生します。 PostMessageでそのハンドルに対してWM_CLOSEを 送ればいいのですが、 ハンドル取得が厄介なのでその辺りは調べてください。
お礼
どうもありがとうございます。 実行しているEXEから、他のEXEを終了させるのは、少々 手荒な操作なんですね。 大変勉強になります。
お礼
参考となるソースを書いていただきましてありがとうございます。 大変参考になります。