Показать сообщение отдельно
Старый 02.11.2007, 14:46   #1
Prof. BiG BanG
Оператор ЭВМ
 
Регистрация: 18.10.2007
Сообщений: 22
Написано 3 полезных сообщений
(для 3 пользователей)
Радость Выключение или перезагрузка компьютера по таймеру

Привет всем
Решил написать программку для выключения компа по таймеру,
самое сложное было, конечно, использование WinApi, но в общем, разобрался. Кому интересно полный исходный текст и саму программу можно скачать здесь: http://bigbang.nm.ru/ShutdownTimer.zip (44KB )
Вот фрагмент кода:
#SE_SHUTDOWN_NAME="SeShutdownPrivilege" 
;странно, что эта кoнстантa не определена в PB
Error$="Error"
tkp.TOKEN_PRIVILEGES 
;структура описывающая привилегии программы
; (требуется установить привилегии для выключения компьютера)
tkpo.TOKEN_PRIVILEGES
zero=0
hToken=0

Procedure ShowErrorMsg() 
;показывает сообщение об ошибке на  понятном языке
  Global Error$
  lpMsgBuf=0
  FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,#NUL,GetLastError_(),#LANG_NEUTRAL,@lpMsgBuf,0,#NUL)
  MessageBox_(#NUL,lpMsgBuf,Error$,#MB_OK|#MB_ICONERROR)
  End
EndProcedure

If Not OpenProcessToken_(GetCurrentProcess_(),#TOKEN_ADJUST_PRIVILEGES|#TOKEN_QUERY,@hToken)
  ShowErrorMsg()
EndIf
If Not LookupPrivilegeValue_(#NUL,#SE_SHUTDOWN_NAME,tkp\Privileges[0]\Luid)
  ShowErrorMsg()
EndIf

tkp\PrivilegeCount=1
tkp\Privileges[0]\Attributes=#SE_PRIVILEGE_ENABLED
If Not AdjustTokenPrivileges_(hToken,#False,@tkp,SizeOf(tkp),@tkpo,@zero)
  ShowErrorMsg()
EndIf
If Not ExitWindowsEx_(#EWX_FORCE|#EWX_SHUTDOWN,0) 
;собственно, само выключениe
  ShowError()
EndIf
(Offline)