只今、OSがシャットダウン中なのかどうか、
そのステータスを取得する方法を知りたいのですが分かりません。

対象OSはWindows9X,NT系全般で、
マイクロソフト系のC言語、でDLLとして作成出来る手段であれば構いません。
最後には結果をVBに渡します。

このシャットダウン中を知りたい理由についてですが、
今挑戦中のものは他のアプリケーションを監視することが目的で、
任意の常駐アプリケーションが常に起動しているかどうかをチェックしています。
起動状態にない場合は何らかのアクションを起こすように設定出来たりするのですが、
シャットダウン中に監視対象の方が先に終了し、
自アプリが健在であるタイミングがまれに発生します。
このとき、シャットダウン中にも関わらずチェック処理が実行され、
起動していなくて当然なのに起動していないよというエラーを出してしまうのです。
この状態を回避する方法として、
OSがシャットダウン中の場合はチェック処理をスキップする。
という方法を思いついたのですが、
この方法が見つかりません。

どなたか、方法をご存知の方、またはもっと良いノウハウをお持ちの方がいらっしゃいましたら、よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

VB で QueryUnload イベント時に(終了しても良いかの問い合わせ時に)第2引数 unloadmode に vbAppWindows が渡されたときが確かシャットダウンが原因で、アプリが終了させられるというような意味だったと思います。



C/C++でやるなら、WM_ENDSESSION メッセージの wParam パラメータが TRUE であるとき、シャットダウン中のようです。

MSDN の ExitWindows API の所をポイントしておきます。
詳しいことは、ここの「解説」の所を読んでみてください。

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

これで解決のきっかけが掴めそうです。

本当にありがとうございました。

お礼日時:2002/02/16 18:28

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

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

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

Aベストアンサー

クラスの生成で外部アプリを起動ってインスタンスの事です?
Newメソッド内でやってるなら、あまりよろしくないので今後はやめた方がよいかと・・・

それはさておき、外部アプリの終了ですが
恐らく新しいプロセスを生成して実行してると思います。
そのプロセスをkillメソッドでやっつけてやればいけませんか?
oboroxxさんの回答と同じですが。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QC# インスタンスの破棄

C#でインスタンスの破棄を明示的に行いたいのですが、
実際の開発現場では、どのように行っているのでしょうか?

自分で調べると「ガベージコレクタ」が暗黙的に行っているようですが明示的には行わないのが普通なのでしょうか?
もしくは、「Dispose」を使用して明示的に行うのが普通なのでしょうか?

実際に開発されている方からすると簡単な事かもしれませんが教えて頂けると助かります。

以上ですが、よろしくお願いいたします。

Aベストアンサー

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム系のオブジェクトや
データベースとのコネクションなどです。これは開発会社や
開発チーム、案件によって若干違っていて、徹底するところや
適当なところもあります。個人的には徹底したい派ですが。。。

ガベージコレクションが発生するとプログラムの実行動作が
遅くなり、また瞬間的に大きな負担がかかることがあります。
そのため全てをガベージコレクタに任せるのではなく、
明示的に開放できるもの、メモリを大量に消費するものは
その都度、適切に開放していくことで処理効率が良くなります。

プログラミング関連の調べ物で、サンプルソース等を見ることが
あるかと思います。この時サンプルで明示的に開放していたら、
それは明示的に開放したほうが良いもの、と思いましょう。
これだけでもステップアップになりますね。

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム...続きを読む


人気Q&Aランキング