ab.com コミュニティ https://www.activebasic.com/forum/ |
|
Windows NT 系の終了のイベント コーディングのエラー https://www.activebasic.com/forum/viewtopic.php?t=182 |
ページ 1 / 1 |
作成者: | M.S. [ 2005年7月15日(金) 14:58 ] |
記事の件名: | Windows NT 系の終了のイベント コーディングのエラー |
コード: 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 [ 2005年7月15日(金) 15:35 ] |
記事の件名: | Re: Windows NT 系の終了のイベント コーディングのエラー |
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. [ 2005年7月15日(金) 15:43 ] |
記事の件名: | Re: Windows NT 系の終了のイベント コーディングのエラー |
教えていただいたとおりにしてコンパイルしても、「Privileges[ANYSIZE_ARRAY] As LUID_AND_ATTRIBUTES」のみ「定数式にリテラル値、または定数以外のものが含まれています」というエラーが出るのですが・・・。 |
作成者: | tak [ 2005年7月15日(金) 16:37 ] |
記事の件名: | Re: Windows NT 系の終了のイベント コーディングのエラー |
> 「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」 > 「48行目・・・ "" 無効な識別子です」 どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。 もう少し、具体的に書いてもらえないでしょうか。 |
作成者: | M.S. [ 2005年7月15日(金) 21:19 ] |
記事の件名: | Re: Windows NT 系の終了のイベント コーディングのエラー |
> どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。 > もう少し、具体的に書いてもらえないでしょうか。 34行目 : Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES 48行目 : .Privileges(0).Attributes=SE_PRIVILEGE_ENABLED です。 説明不足ですいません。 |
作成者: | Sinryow [ 2005年7月15日(金) 22:37 ] |
記事の件名: | |
このコードでもエラーが出ました。「無効な識別子です」でした。 コード: 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さんに報告しておきます。 |
作成者: | M.S. [ 2005年7月16日(土) 08:58 ] |
記事の件名: | Re: |
Sinryou さん、教えていただいた上に SPIRIT さんへの報告までしていただいてありがとうございます。 無事コンパイルできましたので、今から Windows NT 系の「Windows XP Service Pack 2」でテストしてみます。 |
作成者: | M.S. [ 2005年7月16日(土) 09:31 ] |
記事の件名: | |
テストしてみたのですが、コンピュータに反応がありませんでした。 以下が修正した再起動用のコードです。 コード: #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 [ 2005年7月18日(月) 23:00 ] |
記事の件名: | 初投稿! |
返信が遅くなり、大変申し訳ございませんでした。 実験を行った結果、 コード: 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. [ 2005年7月19日(火) 17:53 ] |
記事の件名: | Re: 初投稿! |
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号 [ 2008年6月06日(金) 19:42 ] |
記事の件名: | OSの終了 |
古い話を持ち出して申し訳ありませんが、WinXpのシャットダウンを行ないたく、AB5CP4にて下記の様にしましたが、AdjustTokenPrivileges()に失敗します。 GetLastErr()を行なうとハンドルが無効と出ます。 どなたか修正点を教えて下さい。 [ここをクリックすると内容が表示されます]
|
作成者: | 初心者13号 [ 2008年6月10日(火) 21:14 ] |
記事の件名: | |
まだシャットダウンできていません。 現在のコード [ここをクリックすると内容が表示されます]
AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。
この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。 何だろうなぁ?? 余談ですが、AB5のapi_system.sbpで >>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_ となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・ |
作成者: | 初心者13号 [ 2008年6月12日(木) 19:07 ] |
記事の件名: | |
自己解決しました。 [ここをクリックすると内容が表示されます]
|
作成者: | ゲスト [ 2009年1月11日(日) 21:00 ] |
記事の件名: | |
> まだシャットダウンできていません。 > > 現在のコード > > [ここをクリックすると内容が表示されます]
> AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。
> この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。 > > 何だろうなぁ?? > > 余談ですが、AB5のapi_system.sbpで > > >>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_ > > となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・ |
作成者: | amy [ 2009年7月30日(木) 17:33 ] |
記事の件名: | 11 |
まだシャットダウンできていません。 現在のコード Fashion Accessory Fashion Jewellery Fashion Jewelry 普通話課程 putonghua learn mandarin |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |