HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0522
P波HSP3.4rc1でhmm.dllを使用すると、終了するときに動作が停止する7解決


P波

リンク

2015/5/22(Fri) 16:12:46|NO.69317

HSP3.4rc1で拡張プラグインの「hmm.dll」を使用している状態で
タイトルバーの「×」のボタンを押して終了しようとすると

「hsp3.exeは動作を停止しました」

「問題が発生したため、プログラムが正しく動作しなくなりまいた。
プログラムは閉じられ、解決策がある場合はWindowsから通知されます。」

というエラーメッセージが表示されるようになりました。
HSP3.3では、このような問題は起こりませんでした。
エラーが起きず、正常に終了させるにはどうすればよいでしょうか?
解決策がございましたら、ご回答お願いいたします。
OSはWindows7 Home Premiumで
DirectXのバージョンは11です。

エラーが発生するソースコードは以下のとおりです。

#include "hmm.as"
onexit *exit
dsinit
stop

*exit
dsend
hmmend
end



この記事に返信する


可憐

リンク

2015/5/22(Fri) 23:30:55|NO.69318

何をしても改善されないようでしたら
TerminateProcess関数で自分を終了すれば多分大丈夫だと思います


http://hsp.tv/play/pforum.php?mode=pastwch&num=49554



P波

リンク

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



hiroaki

リンク

2015/5/23(Sat) 12:47:55|NO.69321

https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms686714%28v=vs.85%29.aspx
> Remarks
> The TerminateProcess function is used to unconditionally cause a process to exit.
> The state of global data maintained by dynamic-link libraries (DLLs)
> may be compromised if TerminateProcess is used rather than ExitProcess.
今回の場合、が終了時に破棄しなければならないデータが破棄されないかもしれないので
どうどうなっても知らんよということ。



KA

リンク

2015/5/23(Sat) 20:43:02|NO.69323

正式版でない以上は、「解決策」ではなく「不具合」とする
のが良いのでは?



名無し

リンク

2015/5/24(Sun) 00:40:36|NO.69326

>NO.69317
それ、ひょっとしてこうしたら問題ないんじゃないかな?

#include "hmm.as" onexit gosub *exit dsinit repeat if(exit_flg) :end wait 10 loop *exit dsend hmmend exit_flg = 1 return 要するに、「onexit節でendを使わない」例の手法。 Win8以降でonexitの挙動がおかしい時の対策(バッドノウハウ)だけどこれが効くかもしれない http://predator.hateblo.jp/entry/2014/07/13/133928
>NO.69321
つまりちゃんとリソースが解放されないかもってこと?
まあそもそも、HSPにおけるリソース管理なんてテキトーな気もするけど(暴言)



名無し

リンク

2015/5/24(Sun) 20:40:34|NO.69336

>hiroaki様
やはりそういったリスクがあるんですね。
TerminateProcessは使用を控えようかと思います。

>KA様
そうですね「不具合」だと思います。
hmm.dllがそもそもHSP2.61用に開発されたものということで
HSP3.4のアップデートに対応できなくなったのかもしれません。
今のところ、HSP3.31以前ではエラーメッセージが出ないので
hmm.dllを使う場合はHSP3.31を使おうと思います。

>名無し様
残念ながら、その方法でも同様のエラーが出ます。



P波

リンク

2015/5/24(Sun) 20:41:48|NO.69337

すいません、NO.69336の「名無し」は質問者の「P波」です。



ONION software Copyright 1997-2023(c) All rights reserved.