Привет всем
Решил написать программку для выключения компа по таймеру,
самое сложное было, конечно, использование 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