RIAアプリの複数起動を禁止する方法? (エラーで止まったものも含む)
1社で、Aシステム(RIA3.2c)とBシステム(RIA4Plus)を運用しております。
お客様より、Bシステムは端末ごとに1つしか開かないようにしたいと言われました。
さらにBシステムのメンテナンスでアプリケーションサーバを起動し直したときに、Bシステムが起動していた場合、クライアントではエラーとなると思いますが、そのエラーの状態で画面が残ったままの場合も、それを消さない限りは新たには起動できないようにしたいとのこと。
みなさま、このような制御は実現可能と思われますか?
クライアントパソコンのタスクマネージャの中にはBシステムの名前が表示されているので何か策がありそうな気がするのですが。。
-
アプリ側で制御するなら、
①アプリにログイン機能を設け、二重ログインできないようにする。
②ClientGetUniqueMachineID関数等でクライアント側の一意な値を取得して制御する
等はいかがでしょうか?
-
Teraさま
ありがとうございます。
ClientGetUniqueMachineID関数は初めて知りました。
今回、「エラーで止まっているものであっても、重複起動はだめで、それを閉じれば起動する」、というところが難しいと思っています。
端末で起動したことはどこかに記録して制御できても、アプリがエラー停止した後に、閉じたことを記録できないのではと。
なのでMagicよりもWindows側の何かで判断しないといけないのではと思っています。
-
Windows側であれば
tasklistコマンドの出力結果で判断できるのですが、こちらには環境が無いので3.2と4Plusを区別できるかまでは不明です。
-
コマンド載せ忘れました。
例えば、
tasklist /FI "IMAGENAME eq MgxpaRIA.exe"
とか。/Vや/FO等のパラメータを使って判断できるとよいのですが。
-
otsukaさん、
Magic RIAには、コンテキストを強制的に終了させるという機能が用意されています。
それを使っての案ですが、アプリ起動時にその時のコンテキストIDをLocalデータベースに保存しておき、次回の接続時にそのコンテキストがまだサーバに残っていれば、それを強制終了させる、というロジックで行けるのではないでしょうか?
詳しくは、ヘルプの「コンテキスト管理」が参考になるかと思います。

コンテキストの状態を見る関数:ctxstat()
コンテキストを強制終了させる関数:ctxclose()、ctxkill()ちなみに、コンテキストが残っているかどうかの判定なしに、新しい接続のたびに古いコンテキストを強制的に終了させるという方法でも行けるかと思います。
-
Teraさま
TasklistではRIAのウィンドウ名はうまくとれず、でした。が、別の方法でうまくいきました。
Tandaさま
コンテキストの制御参考になりました。ありがとうございました。今回は、システム更新後にエラーで残っているものも対象にしたかったので、サーバのコンテキストはクリアされてしまっているのかなと思い、別の方法を探しました。
解決した手順は以下の通りです。
1.taskcheck.batを作成し、C:\Bsystem フォルダに配置
--------------------------------------------------------------------
@echo off
REM PowerShellでウィンドウタイトルに「Bシステム」を含むものを検索
powershell -command ^
"if (Get-Process | Where-Object { $_.MainWindowTitle -like '*Bシステム*' }) { exit 0 } else { exit 1 }"if %errorlevel%==0 (
echo Bシステムの画面を検出しました。
echo. > "C:\Bsystem\open"
) else (
echo Bシステムの画面は見つかりませんでした。
if exist "C:\Bsystem\open" (
del "C:\Bsystem\open"
echo openファイルを削除しました。
)
)--------------------------------------------------------------------
2.画面表示前にtaskcheck.batをクライアント実行 ※実行後Delay(10)で処理待ち
3.C:\Bsystemフォルダにopenファイルがないなら、起動
-
otsukaさん、
消えたコンテキストの、ウィンドウの残像を消したいということだったんですね。承知しました。
iOSやAndroid ではウィンドウは1つしか開きませんので、死んだコンテキストのウィンドウは閉じざるを得ないのですが、Windows だと確かにその問題が起こりますね。
サインインしてコメントを残してください。
コメント
7件のコメント