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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0524
UNGAwindowsのシャットダウンを妨げるプログラム22解決


UNGA

リンク

2017/5/24(Wed) 20:07:10|NO.79960

HSPで作成したプログラムが、windowsのシャットダウンを妨げているようです。

プログラムを終了してからシャットダウンすればよいのですが、常駐させている
プログラムを毎回終了してからシャットダウンするのも煩わしいものがあります。

プログラムを終了させないでも、シャットダウン時にメッセージを出さないです
ぐに終了するようにさせるにはどうしたらよいでしょうか。



この記事に返信する


名無し

リンク

2017/5/24(Wed) 20:58:14|NO.79962

OnExit で終了時にダイアログを出すようにしているのですか?
であれば、プログラム終了時に確認ダイアログを出さないように OnExit を実行しない他方法がないと思います。



UNGA

リンク

2017/5/24(Wed) 21:22:47|NO.79964

onexitは使用していません。



いののて

リンク

2017/5/26(Fri) 16:01:41|NO.79983

onexitを使って終了時にendで終了させるとどうでしょうか。



UNGA

リンク

2017/5/26(Fri) 20:30:29|NO.79985

うまく伝わっていないようなのでもう一度書くと、HSPで作られたプログラムを
終了しないままwindowsをシャットダウンしようとすると、「このアプリが
シャットダウンを妨げています」とでて、強制的に終了をいちいち押さないと
シャットダウンができないということです。



Yuuki

リンク

2017/5/26(Fri) 20:50:17|NO.79986

多分これでできると思いますが。

#module #uselib "kernel32.dll" #cfunc GetCurrentProcess "GetCurrentProcess" #uselib "user32.dll" #func ExitWindowsEx "ExitWindowsEx" int, int #uselib "advapi32.dll" #func OpenProcessToken "OpenProcessToken" int, int, var #func LookupPrivilegeValue "LookupPrivilegeValueA" sptr, sptr, var #func AdjustTokenPrivileges "AdjustTokenPrivileges" int, int, var, int, int, int #const TOKEN_QUERY 0x08 #const TOKEN_ADJUST_PRIVILEGES 0x20 #define SE_SHUTDOWN_NAME "SeShutdownPrivilege" #const SE_PRIVILEGE_ENABLED 0x02 #deffunc SystemExit int p1 dim Luid, 2 dim tokenNew, 16 dim tokenPre, 16 hProcess = GetCurrentProcess() OpenProcessToken hProcess, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, hToken LookupPrivilegeValue 0, SE_SHUTDOWN_NAME, Luid tokenNew(0) = 1 memcpy tokenNew(1), Luid, 8 tokenNew(3) = SE_PRIVILEGE_ENABLED AdjustTokenPrivileges hToken, 0, tokenNew, 16, varptr(tokenPre), varptr(ret) ExitWindowsEx p1, 0 return stat #global #define EWX_LOGOFF 0 ; ログオフ #define EWX_SHUTDOWN 1 ; シャットダウン #define EWX_REBOOT 2 ; 再起動 #define EWX_FORCE 4 ; 強制 #define EWX_POWEROFF 8 ; 電源 SystemExit EWX_SHUTDOWN|EWX_FORCE;強制シャットダウン end



 

リンク

2017/5/26(Fri) 23:27:17|NO.79987

「このアプリがシャットダウンを妨げています」とでて、強制的に終了をいちいち押さないと
シャットダウンができないということです。

Windowsでのその画面は終了していないためソフトを強制的に終了するかどうかを訪ねる
画面ですが、その画面で何もせず待っていると、そこに表示されるソフトの終了を自動的に
行ってくれるため、ボタンを押さないと終了できないと言う事は無いと思います。
パソコンのスペックにより異なりますが数秒から1,2分程度で自動的にシャットダウンが始まると思います。

・・・それではだめなのでしょうか?



inovia

リンク

2017/5/27(Sat) 00:48:37|NO.79989

こういうのが出るのが嫌だってことですかね…?
http://hsp.moe/images/20170527_win10.png

自分の環境では、シャットダウンを阻害するようなコード書かない限りは発生しませんでした。
使っているプラグインやモジュールが原因で発生しているかもしれませんね。
(古いHSPを使っていても発生するのかも…?昔64bit環境で正常終了しなかったVerがあったような。)

onexitを使っていないのであれば、逆に使ってみるのはどうでしょう。

onexit gosub *exit stop *exit // シャットダウン等のシステム通知が来たときは iparam に 1 が入る。そうでないときは 0 。 // とりあえず、問答無用で end しておく end return



 

リンク

2017/5/27(Sat) 00:55:42|NO.79991

>>79989
「シャットダウン等のシステム通知が来たときは iparam に 1 が入る」
システム通知が来た時に変数に1が入るというのは初めて知りました。
「放置する」よりも早く終了できて良いですね。いつも思いますが勉強になりますね。



UNGA

リンク

2017/5/27(Sat) 05:52:47|NO.79993


onexit gosub *exit stop *exit if iparam==1 { end } return

としてみましたが状況は変わりませんでした。
キャンセルを押すと、例のC++のRuntimeエラーが出ます。



eol

リンク

2017/5/27(Sat) 08:54:00|NO.79994

HSPの古いバージョンでは確かにそんな動作してました
とりあえず動作環境を書いてみましょう。
HSPとOSのバージョンと不具合が発生する最小限のスクリプトを。



沢渡

リンク

2017/5/27(Sat) 19:37:28|NO.80002

「例のC++のRuntimeエラーが出ます」とは、onexitを実装してから出るのでしょうか? それ以前から出るのでしょうか?
私の経験では、「C++のRuntimeエラー」は、64bit環境で、onexitで飛んだ先でendすると、発生することが多いようです。
(詳しい条件は不明)
以下のようにしてみたらどうなるでしょうか?
参考:http://predator.hateblo.jp/entry/2014/07/13/133928

onexit gosub *exit flag=0 repeat if flag : break await 1000/15 loop end *exit onexit 0 flag=1 return



掘木

リンク

2017/5/27(Sat) 22:02:54|NO.80007

こちらの環境もたまに起こるんですよねえ…
ただこちらの場合は作りが悪いんだろうな思って現状特に検証してはいないのですが。

終了を妨げるってのは、HSPはアプリケーションの終了を決定した後、
BMSCR構造体の解放や動的確保された変数のメモリ解放などを行う終了シーケンスに移行するけども、
その終了シーケンスが渋滞を起こしてしまっていることだと思う。

あくまでも推測ですが、HSP側に問題があるとするなら、
個人的には、デバッグウィンドウが残るケースが何か関連性がありそうと思うところです。
http://hsp.tv/play/pforum.php?mode=all&num=78594#79718
本題の問題は多分実行アプリケーションにされているのでデバッガと直接関係性がありませんが、
その終了シーケンス上のどこにデバッガの解放があるのかを考えると、
「デバッガの解放処理より前」で処理渋滞を起こすと、デバッガが居座る状況も説明できますし、
デバッグ環境でなくても同じように処理渋滞を起こせばこれはwindowsの終了を妨げることになるかと。

openHSPの中身をまーた覗くことになるのか…。



Yuuki

リンク

2017/6/3(Sat) 12:51:16|NO.80089




MillkeySoftw

リンク

2017/6/3(Sat) 15:36:14|NO.80091

そもそも常駐ソフトはちゃんと終了してるの?
(シャットダウン・再起動時ではなくて、自ら終了する方)

自ら終了しようとして、タスクマネージャに実行ファイルが残っていた時点でプロセスの終了処理が完了していない。
この原因を取り除かない限り、いくらやっても無理だと思いますよ。



jsAster

リンク

2017/6/4(Sun) 22:57:30|NO.80118

endの前に"await"と入れればC++のエラーはなんとかなると思います。



UNGA

リンク

2017/6/5(Mon) 18:03:17|NO.80122

返事が遅れてすみません。

色々試してみましたが、結果的に沢渡様に教えていただいた、ループでフラグを判定する方法でなんとか
解決しました。CPUに負担をかけたくないので、できれば無限ループは使いたくなかったので
すが、どうしても「C++のRuntime」がエラーを吐くのでこの方法になりました。(awaitも無効でした)

ところで
>「C++のRuntimeエラー」は、64bit環境で、onexitで飛んだ先でendすると発生する
このエラーの理由は何でしょうか?「C++のRuntimeのエラー」は理由がわからないので本当に厄介です。


皆様、色々と教えていただき、ありがとうございました。



Unknown

リンク

2017/6/5(Mon) 19:58:50|NO.80126

解決チェック忘れてますよ



UNGA

リンク

2017/6/7(Wed) 21:29:28|NO.80146

忘れてました。
ありがとうございました。



Yuuki

リンク

2017/6/8(Thu) 16:36:57|NO.80156

>NO.80146
あなたもよく確認してください。
HOMEの欄は自分のホームページのURLを記載するもので、
別に所持していないなら記載する必要はないのです。
一々「0.1.56.251」と指定する必要はありません。



沢渡

リンク

2017/6/8(Thu) 17:25:38|NO.80157

>NO.80156の「Yuuki」氏を名乗ってる人=NO.80126の「Unknown」氏を名乗ってる人
どうでもいいような他人の咎を何度も鬱陶しくほじくりあげて、掲示板の警察官でも気取ってるんですか?
人のマナーを云々する前に、まずあなたが騙り行為をやめてください。



UNGA

リンク

2017/6/10(Sat) 07:43:00|NO.80164

またチェック忘れたのかな・・・再度。



💰\(・🔽・)/💰

リンク

2017/6/10(Sat) 17:53:48|NO.80170

ホンっトどうでもいいけどさ
>NO.80156 Yuuki氏
NO.79345の言ったこと、0.1.56.251を変えただけだなw
http://hsp.tv/play/pforum.php?mode=all&num=79799



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