Помощь - Поиск - Пользователи - Календарь
Полная версия: выключить комп
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
kikoz
привет,народ smile.gif в программировании я начинающий любитель.понадобилась тут мне програмка,которая бы выключала комп через заданное количество минут (ну скажем до 1000) искать такую прогу в нете лень,да разобраться самому было бы приятнее. как бы такое реализовать на паскале? какой оператор комп выключает-то? smile.gif
Tan
Начинающему любителю лучше начинать с примитива.

 ! 
Нечего сказать по теме ? Промолчи. Человек пришел с конкретным вопросом и хочет получить на него ответ

kikoz
Цитата(Tan @ 18.03.2007 19:33) *

Начинающему любителю лучше начинать с примитива.


спасибо,но лучше ссылочку на исходник blum.gif
klem4
Цитата
kikoz


Решение нужно именно на Паскале ? Делфи не подойдет ? Там есть функции ExitWindows и ExitWindowsEx, с помощью которых это реализуется.
Malice
Для паскаля можно сделать так:
asm
mov ah,0dh { Dos fn release cache}
int 21h
mov ax,5301h {APM function 1, Real Mode Connect}
sub bx,bx {APM BIOS (power device ID)}
int 15h
jc @Exit
mov ax,530eh {APM function e, APM Driver Version}
sub bx,bx {APM BIOS}
mov cx,0102h {select APM 1.2 functionality}
int 15h
jc @Exit
mov ax,5307h {APM function 7, Set Power State}
mov bx,1 {All devices}
mov cx,3 {Off state}
int 15h
@Exit:
end;

С виндовсом наверное не прокатит, не знаю, сейчас пробовать не хочется smile.gif
kikoz
дельфи подойдет smile.gif а вот за ассемблер я пока не принимался,так что в плане образования решение на ассемблере мне пока не интересно,но в любом случае спасибо за беспокойство.приду домой-попробую
kikoz
оказывается тут не все так просто,пообщался с дядей Гуглем,нашел один способ,но мне кажется он чреват потерей данных (на момент выключения у меня будет работать всего одна программа-eMule):


var
t: _Token_Privileges;
ht: cardinal;
rl: cardinal;
begin
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, ht) then begin
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', t.Privileges[0].Luid);
t.PrivilegeCount:=1;
t.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(ht, false, t, 0, nil, rl);
end;
ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0);
end;


проверить пока не могу-на работе нету Делфи

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.