ページ 11

Windows API機能

Posted: 2009年1月26日(月) 11:06
by JT
// 126.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

#include <Windows.h>


void ShutdownWindows(BOOL bReboot, BOOL bForce);

int main(UINT ShutDownWindows)
{
ShutDownWindows(TRUE,TRUE);//void ShutdownWindowsを呼び出して再起動を行う(ここが駄目な箇所)

}



// [引数]
// bReboot : 終了後に再起動する場合はTRUE
// bForce : プロセスを強制的に打ち切る場合はTRUE
//
// [返値]
// 終了指示を発行した : TRUE
// 終了指示が失敗した : FALSE

void ShutdownWindows(BOOL bReboot = FALSE, BOOL bForce = FALSE)
{
DWORD ret;
HANDLE hProcess;
HANDLE hToken;
LUID Luid;
TOKEN_PRIVILEGES tokenNew, tokenPre;
UINT nFlag;

hProcess = GetCurrentProcess();

OpenProcessToken(hProcess,
TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &Luid);

tokenNew.PrivilegeCount = 1;
tokenNew.Privileges[0].Luid = Luid;
tokenNew.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, FALSE, &tokenNew,
sizeof(tokenPre), &tokenPre, &ret);

if (bReboot) {
nFlag = EWX_REBOOT; // 再起動
} else {
nFlag = EWX_POWEROFF; // 電源OFF
}

if (bForce) {
nFlag |= EWX_FORCE; // プロセス強制終了
}

ExitWindowsEx(nFlag, 0); // シャットダウン処理

return;
}
ShutdownWindowsを呼び出して再起動を行う処理が上手くいきません。どなたか教えてください

Re:Windows API機能

Posted: 2009年1月26日(月) 11:30
by JT
インデント忘れてました、、、すいません><

Re:Windows API機能

Posted: 2009年1月26日(月) 11:31
by バグ
呼び出したい関数は、ShutdownWindows関数ですよね?

UINT ShutDownWindows // main関数の引数
void ShutdownWindows(BOOL, BOOL) // シャットダウンを行うのであろう関数

Re:Windows API機能

Posted: 2009年1月26日(月) 11:34
by Mist
規約をよく読んでそれに則った質問をしていただけませんか。
・ソースの字下げをしていない
・「上手くいきません。」ではわからない。もっと具体的に。

Re:Windows API機能

Posted: 2009年1月26日(月) 11:34
by JT
ありがとうございます。ですがこれでもできませんでした

Re:Windows API機能

Posted: 2009年1月26日(月) 11:36
by JT
int main(UINT ShutDownWindows)
{
   ShutDownWindows(TRUE,TRUE);//void ShutdownWindowsを呼び出して再起動を行う(ここが駄目な箇所)

}

ここで再起動処理の引数を渡し、実行したいのですができないのです。

Re:Windows API機能

Posted: 2009年1月26日(月) 11:37
by YuO
5つのWindows APIの呼び出しを行っていますが,一個もエラーチェックをしていませんね……。

・どこのAPI呼び出しで失敗しているのですか。
→各APIのMSDNの記述を読んで,APIごとに判別を行う
・また,その失敗についてGetLastError APIはどう言っているのですか。
→ルックアップツールとか,NET HELPMSGとかで確認もする

Re:Windows API機能

Posted: 2009年1月26日(月) 11:42
by JT
APIにいく前の呼び出し処理の引数で失敗しています><

Re:Windows API機能

Posted: 2009年1月26日(月) 11:44
by Mist
UINT ShutDownWindows

メイン関数の上記の引数は何のためにあるんですか?
引数変数名と関数名が同じのためVC++2008ではコンパイルが出来ますがShutDownWindowsは関数として評価しないと警告が出ます。

Re:Windows API機能

Posted: 2009年1月26日(月) 11:50
by JT
REBOOTをTRUEにする引数です

Re:Windows API機能

Posted: 2009年1月26日(月) 12:00
by Mist
関数名と同じ変数名を使っているのが間違い。
main関数の引数を自分勝手に決めているのが間違い。

Re:Windows API機能

Posted: 2009年1月26日(月) 12:10
by JT
どう直せばいいかご教示お願いします

Re:Windows API機能

Posted: 2009年1月26日(月) 12:18
by Mist
http://edu.inf.shizuoka.ac.jp/lecture/2 ... /ex9c.html

上を読んで勉強してください。

Re:Windows API機能

Posted: 2009年1月26日(月) 12:30
by JT
これはわかります

Re:Windows API機能

Posted: 2009年1月26日(月) 12:43
by Mist
JTさんはもっと質問の仕方を考えたほうがいいと思うね。
先にも書いたがぜんぜん具体的じゃない。

> これはわかります

とだけ返されても、「じゃあ何がわからないの?」としか返せません。

> どう直せばいいかご教示お願いします

一度でも自分でやってみてそれでもだめならともかく、最初から答えを欲しがるようでは成長しないよ?
自分でやってみたのだったら、どういうふうに直したのか、その結果どういう動作になったのかをもっと詳細にするべきです。

Re:Windows API機能

Posted: 2009年1月26日(月) 12:53
by たかぎ
> これはわかります

だとすると、mainの引数は、
int main(int argc, char *argv[/url])
でなければならないことが分かっているのですよね?
にもかかわらず、
int main(UINT ShutDownWindows)
とされている理由は何でしょうか?

もし、分かっていてあえてやっているとすると、考えられる可能性はひとつしかありません。
すなわち、WinMainから上記の非標準のmainを(直接的または間接的に)呼び出しているということです。
そうなのでしょうか?

Re:Windows API機能

Posted: 2009年1月26日(月) 13:06
by Mist
最後のヒント

×:ShutDownWindows(TRUE,TRUE);

○:ShutdownWindows(TRUE,TRUE);

関数呼び出し部分をきちんと直せば再起動できます。(VC++2008EEで確認)

Re:Windows API機能

Posted: 2009年1月26日(月) 13:11
by YuO
どうも,
> 上手くいきません
を見て私は実行時のエラー (文法エラー等は単なるミス) と思っていたのですが,JTさんの発言を読んでいると,コンパイルエラーのような気がしてきます。


まず,何が起きているのかをちゃんと記述してください。
現在のところ,わかっているのは,
・JTさんが最初にあげたプログラムに対して「上手くいかない」と思っていること
のみです。

せっかく規約と注意事項の項目に質問用のテンプレートがあるのですから,
まずはこのテンプレートを埋めて質問をしてください。

Re:Windows API機能

Posted: 2009年1月26日(月) 13:22
by JT
すみません><仕事中なので掲示板に投稿する文章を焦って入力しました

Re:Windows API機能

Posted: 2009年1月26日(月) 14:51
by JT
ありがとうございました!もっと勉強します