ExitWindowsExのコンソールアプリ使用サンプルを作ろうと以下のコードを書きました
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
#include stdafx.h
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
long DW=0L;
if(argc == 2) {
switch (*(argv[1]+1))
{
case 'l':
case 'L':
ExitWindowsEx(EWX_LOGOFF,DW);
break;
case 's':
case 'S':
ExitWindowsEx(EWX_SHUTDOWN,DW);
break;
case 'r':
case 'R':
ExitWindowsEx(EWX_REBOOT,DW);
break;
case 'f':
case 'F':
ExitWindowsEx(EWX_FORCE,DW);
break;
case 'e':
case 'E':
ExitWindowsEx(EWX_FORCEIFHUNG,DW); ←ここ
break;
}
}else{
printf(WinEnd.EXE /option [L:LOGOFF S:SHUTDOWN R:REBOOT
E:強制停止 F:緊急停止 ]);
}
return 0;
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
本題です
「←ここ」で示す部分の「EWX_FORCEIFHUNG」が
C2065:定義されていない識別し
にされてコンパイルが通りません、なぜでしょうか?
MSDNには指定できると書いてありました
何かほかにも特別必要な記述が必要なのでしょうか
WinXP PRO VS.NET2003 Win32コンソールアプリ
winuser.h に
#if(_WIN32_WINNT >= 0x0500)
#define EWX_FORCEIFHUNG 0x00000010
#endif /* _WIN32_WINNT >= 0x0500 */
と記述があるので、
#define _WIN32_WINNT 0x0500
とする必要があるでしょう
.NET なら、stdafx.h にその旨の記述があるかと思います。
ないなら、プリプロセッサで _WIN32_WINNT=0x0500 と指定すればいいかと思います。
あいる さんへ
>winuser.h
はINCLUDEしてませんが、
>#define EWX_FORCEIFHUNG 0x00000010
を
>int _tmain(int argc, _TCHAR* argv[])
の前に定義するだけじゃダメなんでしょうか?
会社からなので今は試せません
えっと、ExitWindowsEx を使うって事は・・・ windows.h はインクルードしてますよね?
それとも自前のAPI宣言??
----
#define EWX_LOGOFF 0
#define EWX_SHUTDOWN 0x00000001
#define EWX_REBOOT 0x00000002
#define EWX_FORCE 0x00000004
#define EWX_POWEROFF 0x00000008
#define EWX_FORCEIFHUNG 0x00000010
#define ExitWindows(dwReserved, Code) ExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)
WINUSERAPI
BOOL WINAPI ExitWindowsEx(IN UINT uFlags, IN DWORD dwReserved);
-----
winuser.h は windows.h 内でインクルードされていいるので、
自分で #include の記述は必要ないですね
で、define の件ですが・・・
コンパイル等は問題なく通ると思います。
MSDNにもあるようにWindows2000以降なら動作も大丈夫でしょう。
ただし、NT4 等で動かす場合・・・どうなるかは保障できません。
# 単に動かないだけかもだし、エラー出すかもだし・・・
# まぁ、バージョンチェックして、NT4なら呼び出さないとかする分にはなんら問題ないと思い
ますが・・・
なんにせよ、動作させるプラットフォームに合わせた設計が必要になると思います。
# ちなみに私は・・・Win9x系とNT4以前のプラットフォーム対応は切り捨てました(^^;
# もっぱら・・・
# WINVER 0x0500
# _WIN32_WINNT 0x0500 // Win2000 以降対応でライブラリ使用
# _WIN32_WINDOWS 0x0500 // Win9x 系の環境依存を無視
# _WIN32_IE 0x0600 // IE6以降のインターフェース使用
# で、開発してます(だって環境少ないほうがデバッグ楽なんだもん)
ここ、参考になるのではないですか?(長くて全部読んでません...)
http://www.tcn.ne.jp/~masugata/mt/archives/000204.html
ここの書き込みから推測すると
EWX_FORCEIFHUNG
を使う場合、あいるさんのようにOSによって切り捨てるかどうか考えるか
OSのバージョンを動的に判断して動作を変更するなどの処理が必要でしょう
あいる さん、ku さん
大変参考になりました、ありがとうございました
まだ自宅に帰ってませんが、解決にさせてください
追伸
NTは多分、利用可能かと思います、VC5についていたWin32 APIリファレンスにも
使えるって書いてましたから
実はそれをみてコーディングしました
あれれ?本当に使えるとされてましたか??
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/sysinfo/base/exitwindowsex.asp
の EWX_FORCEIFHUNG には・・・
Windows NT and Windows Me/98/95: This value is not supported.
Windows NT 及びWindows Me/98/95:この値はサポートされていません。
となっているのが怖い・・・
# 使えないって言っておきながら使えたケースはなくもないですが・・・
関数自体は、
Client: Requires Windows XP, Windows 2000 Professional, Windows NT Workstation,
Windows Me, Windows 98, or Windows 95.
Server: Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server.
なので使用できると思いますけど・・・
# 動作確認しとくほうがいいかも?
今後の人のための訂正
EWX_FORCEIFHUNGは Win32API リファレンス に定義されてませんでした
VS.NET2003のMSDNとごっちゃになってました
あいる さん 間違いの指摘ありがとうございます