• ベストアンサー

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

  • Access2000のプロセスが残る

    Access2000のプロセスが残る こんにちわ、いつもお世話になってます。 実行環境:WindowsXP Pro、Access2000、アプリ1(VB.NET作成) 開発環境:Windows7、Access2007、VB2008、アプリ1(VB.NET作成) VB.NET作成アプリはSQLサーバに情報を登録し 登録された情報をもとに印刷用テーブルを作成し Accessのマクロを起動させるプログラムです。 AccessはリンクテーブルでSQLサーバと接続され、 印刷用のレポートがあり、マクロはレポートを起動するものです。 プログラムは以下のような記述をしています。 ============================================ Dim oAcs As Access.Application oAcs = New Access.Application oAcs.OpenCurrentDatabase("C:\Print.mdb") oAcs.DoCmd.SetWarnings(False) oAcs.DoCmd.RunCommand(10) ' ウィンドウの最大化 oAcs.DoCmd.OpenForm("印刷") '印刷マクロ起動 oAcs.DoCmd.Maximize() ' 画面の最大化 oAcs.Visible = True AppActivate("Microsoft Access") oAcs.DoCmd.RunCommand(10) ' ウィンドウの最大化 ============================================ レポート表示後の印刷は自動ではないため Accessを起動したら起動しっぱなしになってます。 解放処理をしていないのでプロセスが残るのは既知です。 開発環境にてアプリ1を実行させAccessでレポートを表示させます。 Accessを終了してもプロセスが残りますがアプリ1を終了させると Accessのプロセスは終了します。 実行環境にて上記の同様の動作を行うと アプリ1を終了させてもプロセスが残ってしまう場合があります。 VB.NETで作成された同様のアプリからのAccess起動にも関わらず プロセスが残ってしまうのはAccessのバージョンとかが関係してるんでしょうか? 情報提供をお待ちしてます。

  • windows プロセス間の連携で問題

    ウィンドウズで、dllと共有セクションを利用して複数のプロセスが協調して動作するシステムを開発しています。 あるプロセスが処理をしている間に他のプロセスが同じ処理をしたら困るので、フラグを処理中を意味する値にセットし処理が終わればフラグを戻し、という風にしているのですが、フラグをセットしている途中に他のプロセスに切り替わり、そこで他のプロセスが同じ処理をしてしまったら(確立はかなり低い)思った通りに動作しません。この問題に対して何か解決策はありますか?それともそこまで精密さを求めなくてもいいでしょうか?回答よろしくお願いします。

  • Windowsのプロセスの件について

    いつもお世話になります。 ご質問があります。 DCOMを使用している環境なのですが、クライアントでサーバに命令を投げて処理を行いますが、この時、サーバで立ち上がったWindowsのプロセスが終了しない現象が発生しております。 そこで、どの端末で処理した際のプロセスが終了しないかを探したいのですが、VB5.0のPGでそれは可能でしょうか? 例) (1)"XXX"というPGを"A"、"B"、"C"の端末で起動。 (2)サーバのプロセスに"XXX.exe"が3つできる。 (3)"XXX.exe"というPGを各端末で終了させる。 (4)3つあった"XXX.exe"のうち2つが消えるが、1つは残りっぱなしになる。 (5)どうにかして「残った"XXX.exe"はこの端末だ!」と断定したい。 尚、環境はOSはWindows NT、VB5.0です。 以上、ご存知の方がいましたらご教授を宜しくお願い致します。

  • DLLにおいて、最後のプロセスデタッチだと判断する方法

    WindowsNT 4.0、VC++ 5.0 を使っています。 マルチプロセスに対応するDLLにおいて、DllMain()の デタッチ(DLL_PROCESS_DETACH)処理で、「これが最後の プロセスだ」と判断する方法はないでしょうか。 共有データとしてカウンタを持って、アタッチ、デタッチで 加減算しようと考えましたが、あるプロセスがアクセス違反などで 落ちたり、タスクマネージャなどから強制終了させられると デタッチルーチンは動作しないので、駄目だと気付きました。 何かいい方法などがありましたら、ご教授願います。

  • プロセスについて

    アプリを起動するとプロセスが発生すると思うのですが、そのプロセスはまず仮想メモリアドレス空間に待機しその後物理メモリにて処理され、いっぱいだった場合はページングファイルが使われると思います。 その場合、1つのアプリでのプロセスが物理メモリとページングファイルに分かれることはあるのでしょうか?

  • dllの取得

    VB2005を使用しています。実行中のシステムで使用しているDLLは Assembly.GetReferencedAssembliesを使用して取得できたのですが、 処理を行う過程で、別のシステム(例:Sample.exe)で実行に必要なDLLを取得する方法がわかりません。 どなたかわかる方がいらっしゃれば是非ご教授ください。 ちなみに、Sample.exeは起動していません。 必要であればProcess.Start()等で一時的に起動しても構いません。 非表示で起動してしまえばいいので… ↓雰囲気的にはこんな感じです。 '指定された実行可能ファイルに必要なDLL一覧を取得 Dim sDllFiles() AS String = XXX.XXXX("C:\Test\Sample.exe")

  • プロセス終了の検知について

    Win2000、VB.net、.NET Framework 1.1 でWindowsアプリケーションを作成しています。 画面が表示されていない状態で、ある処理を行っている時に タスクマネージャからプロセスを終了させられたことを検知する イベントを教えてください。 Mainで Application.ApplicationExit, Application.ThreadExit のイベントをAddHandlerで関連付けているのですが タスクマネージャからプロセスを終了しても 関連付けたプロシージャの処理が行われません。 タスクマネージャからプロセスを終了した場合は そのプロセスにメッセージは送られないのでしょうか? また、ある条件になると画面を表示する仕様なのですが 画面を表示中にタスクマネージャからプロセスを終了しても Form_Closingイベントが発生しません。 そういうものなのですか? よろしくお願いいたします。

  • EXCELのプロセスが残ってしまう

    VBからExcelを起動し、ごく稀にExcelのプロセスが残ってしまう場合があります。全く同じ条件で実行した場合、残る時と残らない時とありを悩ませています。 いろいろな対策方法が検索できましたが、解決しませんでした。 また、このようにExcelプロセスが残った際、IISの動作がおかしくなっているのか、「CGIエラー」を返します。ただし、exeなど実行系ファイルを実行せず、XXX.HTMなどは表示できます。 VBで記述したexeは、CGI系のアプリとしてブラウザから実行されています。 対処方法ご存知でしたら、教えて下さい。 環境 NT4サーバ+SP6a Excel97 VB5.0

  • OSシャットダウン時の常駐アプリ終了について

    現在VB2005にて常駐アプリの開発を行っています。 OSはWindowsXPです。 起動はOS起動時にスタートアップより起動するのですが、 OSのシャットダウン時に常駐アプリが終了していない為、 「このプログラムからの応答がありません(待機、終了、キャンセル)」が表示されます。 この方法を回避するには、シャットダウンを常駐アプリ側で検知してアプリ自身が終了処理をすると思いますが、方法がよくわかっていません。 http://dobon.net/vb/dotnet/system/sessionending.html ↑のURLを参照してみたのですが、シャットダウン時にメッセージの表示はされるのですが、メッセージ表示部をアプリ終了処理に置き換えても、終了処理が行われませんでした。 どなたか、お分かりになる方ご教授いただければと思います。

  • プロセス監視の方法

    どのたかよい方法をご存知の方いらっしゃいましたら、 助力お願いします。 .NETのアプリケーションで、ある特定のプロセスが起動した時に 処理を実行するアプリを作りたいと思っています。 この場合のあるプロセスとは、Notepadとか、Wordとかです。 無限ループで、プロセスを監視しようと思ったのですが、 メモリの消費が多く重たいので、何かよい方法はないでしょうか? 例えば、ある特定のプロセスが起動したら、 それがトリガーとなるような仕組みとか、可能でしょうか? よろしくお願いします。

専門家に質問してみよう