|
2015/5/23(Sat) 09:07:49|NO.69320
リンク先の内容を参考にTerminateProcess関数を使って
終了させたところ、エラーが発生せずに終了することができました。
可憐様、ありがとうございます。
ただ、TerminateProcessは正常な終了処理を行わずにプロセスを
強制終了させるということですが、やはり通常のend命令よりも
リスクが高いものなのでしょうか?
拡張プラグインを終了させる命令を呼び出した後に
TerminateProcessの呼び出しをモジュールで行うようにしたのですが
この場合、どういった問題が起こり得るでしょうか?
また、画像ファイルや音声ファイルのメモリを確保している場合
TerminateProcessでメモリ解放されるのでしょうか?
一応、問題は解決したので、解決のチェックを入れますが
少し不安なので、よろしければご回答お願いいたします。
修正したソースコードは以下のとおりです。
#include "hmm.as"
onexit *exit
;プロセスを強制終了させるモジュール
#module
#deffunc terminate str prname
processname = prname
; API の宣言
#uselib "kernel32.dll"
#cfunc OpenProcess "OpenProcess" int, int, int
#func CloseHandle "CloseHandle" int
#cfunc TerminateProcess "TerminateProcess" int, int
#uselib "psapi.dll"
#func EnumProcesses "EnumProcesses" var, int, var
#cfunc EnumProcessModules "EnumProcessModules" int, var, int, var
#func GetModuleFileNameEx "GetModuleFileNameExA" int, int, var, int
#func GetModuleBaseName "GetModuleBaseNameA" int, int, var, int
; 変数の宣言
dim proc, 1000000
dim ret
; 起動中のプロセスリスト取得
EnumProcesses proc, length(proc), ret
; プロセスリストから指定のプロセスを取得
repeat ret / 4
; プロセスハンドルを取得
hProc = OpenProcess(0x400 | 0x0010 | 0x0001, 0, proc(cnt))
; プロセスハンドルが取得できたら
if hProc {
if(EnumProcessModules(hProc, list, 4, ret)) {
sdim file, 256
sdim file_name, 256
; モジュール名とモジュールのプルパス取得
GetModuleFileNameEx hProc, list, file, 256
GetModuleBaseName hProc, list, file_name, 256
; 終了させたいモジュール名だったら(小文字限定)
if(getpath(file, 8) = processname) { ;←ここに終了したいプロセス名をいれる。
; 強制終了させる
if(TerminateProcess(hProc, 0) = 0) {
dialog "終了できませんでした"
}
}
}
; プロセスハンドルを閉じる
CloseHandle hProc
}
loop
return
#global
dsinit
stop
*exit
dsend
hmmend
terminate"hsp3.exe"
end

| |