Windows NT 系の終了のイベント コーディングのエラー

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

Windows NT 系の終了のイベント コーディングのエラー

#1 投稿記事 by M.S. »

コード: 全て選択


Declare Function ExitWindowsEx Lib "user32" (uFlags As Long,dwReserved As Long) As Long
Declare Function OpenProcessToken Lib "advapi32" (ProcessHandle As DWord,DesiredAccess As Long,_
	ByRef TokenHandle As Long) As Long
Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (lpSystemName As String,_
	lpName As String,ByRef lpLuid As LUID) As Long
Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long,DisableAllPrivileges As Long,_
	ByRef NewState As TOKEN_PRIVILEGES,BufferLength As Long,_
	ByRef PreviousState As TOKEN_PRIVILEGES,ByRef ReturnLength As Long) As Long

'動作フラグ============
Const EWX_LOGOFF=0
Const EWX_SHUTDOWN=1
Const EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================

Const TOKEN_QUERY=&H8
Const TOKEN_ADJUST_PRIVILEGES=&H20

Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2
Const ANYSIZE_ARRAY=0

Type LUID
	LowPart As Long
	HighPart As Long
End Type

Type LUID_AND_ATTRIBUTES
	pLuid As LUID
	Attributes As Long
End Type

Type TOKEN_PRIVILEGES
	PrivilegeCount As Long
	Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type

ExitWindows()
End

Sub ExitWindows()	
Dim Handle As Long
Dim TPS As TOKEN_PRIVILEGES
Dim TPS_P As TOKEN_PRIVILEGES
Dim Size As Long

With TPS
	.PrivilegeCount=1
	.Privileges(0).Attributes=SE_PRIVILEGE_ENABLED
End With

If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf

If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(0).pLuid)=FALSE Then
MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf

If AdjustTokenPrivileges(Handle,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf

ExitWindowsEx(EWX_REBOOT,0)
End Sub
また SPIRIT さんの「ON ERROR RESUME NEXT」のコードをコピー&ペーストしたものなのですが、Windows NT 系の終了のイベント コーディングで、これをコンパイルすると、「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」と「48行目・・・ "" 無効な識別子です」というエラーが出るのですが、どうすればよいでしょか?
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

Re: Windows NT 系の終了のイベント コーディングのエラー

#2 投稿記事 by hira »

Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
Privileges[ANYSIZE_ARRAY] As LUID_AND_ATTRIBUTES

.Privileges(0).Attributes=SE_PRIVILEGE_ENABLED
.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED

とすればうまくコンパイルできました。
AB4.0では配列参照は角カッコしか使えない、ということでしょうかね…?
※AB3.xではうまく動いていたコードです
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

Re: Windows NT 系の終了のイベント コーディングのエラー

#3 投稿記事 by M.S. »

教えていただいたとおりにしてコンパイルしても、「Privileges[ANYSIZE_ARRAY] As LUID_AND_ATTRIBUTES」のみ「定数式にリテラル値、または定数以外のものが含まれています」というエラーが出るのですが・・・。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

Re: Windows NT 系の終了のイベント コーディングのエラー

#4 投稿記事 by tak »

> 「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」
> 「48行目・・・ "" 無効な識別子です」

どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。
もう少し、具体的に書いてもらえないでしょうか。
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

Re: Windows NT 系の終了のイベント コーディングのエラー

#5 投稿記事 by M.S. »

> どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。
> もう少し、具体的に書いてもらえないでしょうか。

34行目 : Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES

48行目 : .Privileges(0).Attributes=SE_PRIVILEGE_ENABLED

です。
説明不足ですいません。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#6 投稿記事 by Sinryow »

このコードでもエラーが出ました。「無効な識別子です」でした。

コード: 全て選択

Dim h As Long
h=ANYSIZE_ARRAY
ということは,ANYSIZE_ARRAY定数自体が定義されていないわけです。
実際,ABのincludeフォルダを検索しても「ANYSIZE_ARRAY」は見つかりませんでした。

以下の一行を追加してはいかがでしょうか。

コード: 全て選択

Const ANYSIZE_ARRAY = 1
※Cのwinnt.hから持ってきました

あと,TOKEN_PRIVILEGES構造体は

コード: 全て選択

Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    Privileges(ELM(ANYSIZE_ARRAY)) As LUID_AND_ATTRIBUTES ' ELMが必要
End Type
が正しいです。(これもwinnt.hより)

また,この点はSPIRITさんに報告しておきます。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

Re:

#7 投稿記事 by M.S. »

Sinryou さん、教えていただいた上に SPIRIT さんへの報告までしていただいてありがとうございます。

無事コンパイルできましたので、今から Windows NT 系の「Windows XP Service Pack 2」でテストしてみます。
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

#8 投稿記事 by M.S. »

テストしてみたのですが、コンピュータに反応がありませんでした。
以下が修正した再起動用のコードです。

コード: 全て選択


#include "WINNTRB.idx"

' ↓ ここからプログラムが実行されます

Declare Function ExitWindowsEx Lib "user32" (uFlags As Long,dwReserved As Long) As Long
Declare Function OpenProcessToken Lib "advapi32" (ProcessHandle As DWord,DesiredAccess As Long,_
    ByRef TokenHandle As Long) As Long
Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (lpSystemName As String,_
    lpName As String,ByRef lpLuid As LUID) As Long
Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long,DisableAllPrivileges As Long,_
    ByRef NewState As TOKEN_PRIVILEGES,BufferLength As Long,_
    ByRef PreviousState As TOKEN_PRIVILEGES,ByRef ReturnLength As Long) As Long

'動作フラグ============
const EWX_LOGOFF=0
CONST EWX_SHUTDOWN=1
CONST EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================

Const TOKEN_QUERY=&H8
Const TOKEN_ADJUST_PRIVILEGES=&H20

Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2Const ANYSIZE_ARRAY=0
Const ANYSIZE_ARRAY = 1

Type LUID
	LowPart As Long
	HighPart As Long
End Type

Type LUID_AND_ATTRIBUTES
	pLuid As LUID
	Attributes As Long
End Type

Type TOKEN_PRIVILEGES
	PrivilegeCount As Long
	Privileges(ELM(ANYSIZE_ARRAY)) As LUID_AND_ATTRIBUTES
End Type

ExitWindows()

Sub ExitWindows()
	Dim Handle As Long
	Dim TPS As TOKEN_PRIVILEGES
	Dim TPS_P As TOKEN_PRIVILEGES
	Dim Size As Long

	With TPS
		.PrivilegeCount=1
		.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED
	End With

If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf

If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(0).pLuid)=FALSE Then
MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If AdjustTokenPrivileges(Handle,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
ExitWindowsEx(EWX_REBOOT,0)
End Sub
SPIRIT
記事: 9
登録日時: 2005年5月31日(火) 22:59
お住まい: 兵庫県神戸市
連絡する:

初投稿!

#9 投稿記事 by SPIRIT »

返信が遅くなり、大変申し訳ございませんでした。
実験を行った結果、

コード: 全て選択

Type TOKEN_PRIVILEGES 
    PrivilegeCount As Long 
    Privileges(ELM(ANYSIZE_ARRAY)) As LUID_AND_ATTRIBUTES 
End Type 
ELM() はあってもなくても動作は変わりありませんでした。
Const ANYSIZE_ARRAY = 1
にすると反応しないようです。

以下のソースは私の環境で再起動に成功したものです。

コード: 全て選択

Declare Function ExitWindowsEx Lib "user32" (uFlags As Long,dwReserved As Long) As Long
Declare Function OpenProcessToken Lib "advapi32" (ProcessHandle As DWord,DesiredAccess As Long,_
	ByRef TokenHandle As Long) As Long
Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (lpSystemName As String,_
	lpName As String,ByRef lpLuid As LUID) As Long
Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long,DisableAllPrivileges As Long,_
	ByRef NewState As TOKEN_PRIVILEGES,BufferLength As Long,_
	ByRef PreviousState As TOKEN_PRIVILEGES,ByRef ReturnLength As Long) As Long

'動作フラグ============
Const EWX_LOGOFF=0
Const EWX_SHUTDOWN=1
Const EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================

Const TOKEN_QUERY=&H8
Const TOKEN_ADJUST_PRIVILEGES=&H20

Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2
Const ANYSIZE_ARRAY=0


Type LUID
	LowPart As Long
	HighPart As Long
End Type

Type LUID_AND_ATTRIBUTES
	pLuid As LUID
	Attributes As Long
End Type

Type TOKEN_PRIVILEGES
	PrivilegeCount As Long
	Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type

	ExitWindows()
	End

Sub ExitWindows()	
	Dim Handle As Long
	Dim TPS As TOKEN_PRIVILEGES
	Dim TPS_P As TOKEN_PRIVILEGES
	Dim Size As Long

	With TPS
		.PrivilegeCount=1
		.Privileges[ANYSIZE_ARRAY].Attributes=SE_PRIVILEGE_ENABLED
	End With

	If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
		MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
		Exit Sub
	EndIf

	If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(ANYSIZE_ARRAY).pLuid)=FALSE Then
		MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
		Exit Sub
	EndIf

	If AdjustTokenPrivileges(Handle,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
		MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
		Exit Sub
	EndIf

	ExitWindowsEx(EWX_REBOOT,0)
End Sub
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

Re: 初投稿!

#10 投稿記事 by M.S. »

SPIRIT さんすいません、エラーが出たのは僕が SPIRIT さんのページから AB の Project Editor にコピペしたときに、

コード: 全て選択


Const SE_SHUTDOWN_NAME="SeShutdownPrivilege" 
Const SE_PRIVILEGE_ENABLED=&H2
Const ANYSIZE_ARRAY=0
のところを、

コード: 全て選択

Const SE_SHUTDOWN_NAME="SeShutdownPrivilege" 
Const SE_PRIVILEGE_ENABLED=&H2Const ANYSIZE_ARRAY=0
と、改行をしわすれてしまったからのようです・・・。

そして今の正常に動作するコードは

コード: 全て選択


#include "WINNTRB.idx"

' ↓ ここからプログラムが実行されます

Declare Function ExitWindowsEx Lib "user32" (uFlags As Long,dwReserved As Long) As Long
Declare Function OpenProcessToken Lib "advapi32" (ProcessHandle As DWord,DesiredAccess As Long,_
    ByRef TokenHandle As Long) As Long
Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (lpSystemName As String,_
    lpName As String,ByRef lpLuid As LUID) As Long
Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long,DisableAllPrivileges As Long,_
    ByRef NewState As TOKEN_PRIVILEGES,BufferLength As Long,_
    ByRef PreviousState As TOKEN_PRIVILEGES,ByRef ReturnLength As Long) As Long

'動作フラグ============
const EWX_LOGOFF=0
CONST EWX_SHUTDOWN=1
CONST EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================

Const TOKEN_QUERY=&H8
Const TOKEN_ADJUST_PRIVILEGES=&H20

Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2
Const ANYSIZE_ARRAY = 1

Type LUID
	LowPart As Long
	HighPart As Long
End Type

Type LUID_AND_ATTRIBUTES
	pLuid As LUID
	Attributes As Long
End Type

Type TOKEN_PRIVILEGES
	PrivilegeCount As Long
	Privileges(ELM(ANYSIZE_ARRAY)) As LUID_AND_ATTRIBUTES
End Type

ExitWindows()

Sub ExitWindows()
	Dim Handle As Long
	Dim TPS As TOKEN_PRIVILEGES
	Dim TPS_P As TOKEN_PRIVILEGES
	Dim Size As Long

	With TPS
		.PrivilegeCount=1
		.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED
	End With

If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf

If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(0).pLuid)=FALSE Then
MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If AdjustTokenPrivileges(Handle,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
ExitWindowsEx(EWX_REBOOT,0)
End Sub
です。
初心者13号

OSの終了

#11 投稿記事 by 初心者13号 »

古い話を持ち出して申し訳ありませんが、WinXpのシャットダウンを行ないたく、AB5CP4にて下記の様にしましたが、AdjustTokenPrivileges()に失敗します。
GetLastErr()を行なうとハンドルが無効と出ます。

どなたか修正点を教えて下さい。
初心者13号

#12 投稿記事 by 初心者13号 »

まだシャットダウンできていません。

現在のコード
AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。
この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。

何だろうなぁ??

余談ですが、AB5のapi_system.sbpで

>>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_

となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・
初心者13号

#13 投稿記事 by 初心者13号 »

自己解決しました。
ゲスト

#14 投稿記事 by ゲスト »

> まだシャットダウンできていません。
>
> 現在のコード
>
> > AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。
> この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。
>
> 何だろうなぁ??
>
> 余談ですが、AB5のapi_system.sbpで
>
> >>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_
>
> となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・
amy

11

#15 投稿記事 by amy »

まだシャットダウンできていません。

現在のコード



Fashion Accessory Fashion Jewellery Fashion Jewelry 普通話課程 putonghua learn mandarin
返信する