- ベストアンサー
DLLがどのプロセスからもアクセスされなくなった時の変数の値
プロセス(VBアプリなど)間で、フラグを参照(共有)するためのDLLがあるとします。 すべてのプロセスが終了した際、そのDLL内のフラグは0(ゼロ)に落ちるのでしょうか? というのも、あるVBアプリでDLLを介してグローバルでint変数のフラグを立てたり落としたりして、 二重起動禁止したいと考えております。(諸事理由にてFindWindowやApp.PrevInstanceでは実現不可だったため)。 VBアプリが起動時にDLLの共有関数を読みに行き、1なら起動終了。0なら起動。 VBアプリは終了時に0を書いて終わる。という処理です。 現状では上記処理をDLLではなく、セマフォファイル的にテキストファイル内で"1"や"0"にして、行っていたのですが、 何らかの理由で、1のままでプロセスが終了(ランタイムエラーなどの異常終了だと思います)してしまったようで、 デッドロック状態となり、VBアプリが二度と起動しないハメに陥ってしまいました。 もし冒頭のように、DLLにアクセスするどのプロセスも終了した際、DLL内のフラグが0に落ちてくれるのなら、 この現象は発生しないはず・・・と期待を込めての質問です。 実際に試してみればわかるでしょう・・・と言われそうですね。 わたしも10年以上昔、試して0になっていたように記憶してます。 しかし当時とはOSもVCのバージョンも変わりましたし、案件のアプリが業務のアプリなので、 根拠がないと、テスト時たまたま希望通りの結果が出ただけ・・・というのでは許されないため (しかも、上記のように既に客先でトラブルになっておりますので二度と失敗は許されません・・・(泣)。) みなさまにお尋ねしている次第です。 ご回答いただける方、できればなんらかの参考URLや出典情報なども添えていただけると大変ありがたいです。 以上、どなたかのご教示をお待ちしています。宜しくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Win32APIのCreateMutexのMutexでチェックして起動制御するのは?
その他の回答 (1)
- Tasuke22
- ベストアンサー率33% (1799/5383)
アプリの終了にはありとあらゆるケースがあります。 アプリがどのような終了の仕方をしてもポストされる モジュールを登録できたとしても、システムが落ちる とフラグが立ったままとなります。このことだけを考 えても、きつい書き方かもしれませんが、テキストフ ァイルで管理する発想自体が誤りでしょう。不可能と 言い切れます。 せいぜい、フラグが立ったままになったのを確認した 時にフラグを落とすアプリを用意するくらいでしょう。 かっこうわるい、ですが。 > 諸事理由にてFindWindowやApp.PrevInstanceでは実現不可だったため この諸事理由を解決するのが本筋でしょう。
お礼
Tasuke22回答ありがとうございます! >テキストファイルで管理する発想自体が誤りでしょう。 今になってそう反省しています。 >この諸事理由を解決するのが本筋でしょう。 FindWindowで不可能な理由は、アプリがMain関数で始まり、最初のフォーム(ウィンドウ)を表示するまでに、初期処理時間が結構あり、 その期間は、FindWindowのキャプションでの検索ができないためだと思います。 App.PrevInstanceでの理由は不明です。
お礼
maguro999さん回答ありがとうございます! CreateMutexも考えましたが、今回のように異常終了した場合、ミューテックスハンドルは解放されるのか(多分ハンドルなので解放されるんですよね)が心配です。 再度質問ですが解放されるんでしょうか?