メインコンテンツへスキップ

RIAアプリの複数起動を禁止する方法? (エラーで止まったものも含む)

コメント

7件のコメント

  • Tera

    アプリ側で制御するなら、

    ①アプリにログイン機能を設け、二重ログインできないようにする。

    ②ClientGetUniqueMachineID関数等でクライアント側の一意な値を取得して制御する

    等はいかがでしょうか?

  • otsuka

    Teraさま

    ありがとうございます。

    ClientGetUniqueMachineID関数は初めて知りました。

    今回、「エラーで止まっているものであっても、重複起動はだめで、それを閉じれば起動する」、というところが難しいと思っています。

    端末で起動したことはどこかに記録して制御できても、アプリがエラー停止した後に、閉じたことを記録できないのではと。

    なのでMagicよりもWindows側の何かで判断しないといけないのではと思っています。

  • Tera

    Windows側であれば

    tasklistコマンドの出力結果で判断できるのですが、こちらには環境が無いので3.2と4Plusを区別できるかまでは不明です。

  • Tera

    コマンド載せ忘れました。

    例えば、

    tasklist /FI "IMAGENAME eq MgxpaRIA.exe"

    とか。/Vや/FO等のパラメータを使って判断できるとよいのですが。

  • Tanda

    otsukaさん、

    Magic RIAには、コンテキストを強制的に終了させるという機能が用意されています。

    それを使っての案ですが、アプリ起動時にその時のコンテキストIDをLocalデータベースに保存しておき、次回の接続時にそのコンテキストがまだサーバに残っていれば、それを強制終了させる、というロジックで行けるのではないでしょうか?

    詳しくは、ヘルプの「コンテキスト管理」が参考になるかと思います。

    コンテキストの状態を見る関数:ctxstat()
    コンテキストを強制終了させる関数:ctxclose()、ctxkill()

    ちなみに、コンテキストが残っているかどうかの判定なしに、新しい接続のたびに古いコンテキストを強制的に終了させるという方法でも行けるかと思います。

  • otsuka

    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ファイルがないなら、起動

  • Tanda

    otsukaさん、

    消えたコンテキストの、ウィンドウの残像を消したいということだったんですね。承知しました。

    iOSやAndroid ではウィンドウは1つしか開きませんので、死んだコンテキストのウィンドウは閉じざるを得ないのですが、Windows だと確かにその問題が起こりますね。

サインインしてコメントを残してください。