• ベストアンサー

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や出典情報なども添えていただけると大変ありがたいです。 以上、どなたかのご教示をお待ちしています。宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • maguro999
  • ベストアンサー率21% (59/273)
回答No.2

Win32APIのCreateMutexのMutexでチェックして起動制御するのは?

fu-chan52
質問者

お礼

maguro999さん回答ありがとうございます! CreateMutexも考えましたが、今回のように異常終了した場合、ミューテックスハンドルは解放されるのか(多分ハンドルなので解放されるんですよね)が心配です。 再度質問ですが解放されるんでしょうか?

その他の回答 (1)

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

アプリの終了にはありとあらゆるケースがあります。 アプリがどのような終了の仕方をしてもポストされる モジュールを登録できたとしても、システムが落ちる とフラグが立ったままとなります。このことだけを考 えても、きつい書き方かもしれませんが、テキストフ ァイルで管理する発想自体が誤りでしょう。不可能と 言い切れます。 せいぜい、フラグが立ったままになったのを確認した 時にフラグを落とすアプリを用意するくらいでしょう。 かっこうわるい、ですが。 > 諸事理由にてFindWindowやApp.PrevInstanceでは実現不可だったため この諸事理由を解決するのが本筋でしょう。

fu-chan52
質問者

お礼

Tasuke22回答ありがとうございます! >テキストファイルで管理する発想自体が誤りでしょう。 今になってそう反省しています。 >この諸事理由を解決するのが本筋でしょう。 FindWindowで不可能な理由は、アプリがMain関数で始まり、最初のフォーム(ウィンドウ)を表示するまでに、初期処理時間が結構あり、 その期間は、FindWindowのキャプションでの検索ができないためだと思います。 App.PrevInstanceでの理由は不明です。

関連するQ&A