Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2008, 09:36   #1
Патрон
Форумчанин
 
Аватар для Патрон
 
Регистрация: 07.03.2008
Сообщений: 151
По умолчанию Выключение и перезагрузка

Подскажите пожалуйста функцию выключения компа и/или его перезагрузки. Очень надо. Заранее спасибо.
Патрон вне форума Ответить с цитированием
Старый 26.03.2008, 10:08   #2
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Системная прога, "shutdown", вызови её в командной строке с параметром "/?" и смотри как она работает.
Потом в своей проге вызывай её как положено и всё.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 26.03.2008, 11:27   #3
Патрон
Форумчанин
 
Аватар для Патрон
 
Регистрация: 07.03.2008
Сообщений: 151
По умолчанию

А можешь написать конкретную функцию выключения и/или перезагрузки компа?
Патрон вне форума Ответить с цитированием
Старый 26.03.2008, 11:31   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Патрон Посмотреть сообщение
А можешь написать конкретную функцию выключения и/или перезагрузки компа?
А слабо использовать поиск по форуму со словом "перезагрузка"???
mihali4 вне форума Ответить с цитированием
Старый 26.03.2008, 11:41   #5
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Конечно есть отдельная функция для этого дела, только она не ахти как работает на Win XP
мои наработки (если в винде есть спец проги для этого, зачем что-то придумывать.)

Код:
Uses ShellApi;
function SysWinDir(Wid:string):string; //это определить сис директории
var
wind:Array[0..MAX_PATH] of char;
begin
if Wid='win' then
 begin
  GetWindowsDirectory(wind,sizeof(wind));
  result:=StrPas(wind);
  exit;
 end;
if Wid='sys' then
 begin
  GetSystemDirectory(wind,sizeof(wind));
  result:=StrPas(wind);
  exit;
 end;
end;
...

begin
//для откл через 20 сек выкл, если 0 то сразу
shellexecute(application.Handle,pchar('Open'),
pchar(syswindir('sys')+'\shutdown.exe'),pchar('-s -t '+inttostr(20)),'',1);


//для отмены
shellexecute(application.Handle,pchar('Open'),
pchar(syswindir('sys')+'\shutdown.exe'),pchar('-a'),'',1);

//для перезагрузки через 20 сек перез., если 0 то сразу
shellexecute(application.Handle,pchar('Open'),
pchar(syswindir('sys')+'\shutdown.exe'),pchar('-r -t '+inttostr(20)),'',1);
end;
Спрашивай если что.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 26.03.2008, 12:13   #6
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Можешь сделать так:
Для перезагрузки:

procedure TForm1.Button1Click(Sender: TObject);
var
hToken: THandle;
tkp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
if OpenProcessToken(GetCurrentProcess( ), TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY, hToken) then
begin
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
ExitWindowsEX(EWX_REBOOT,0);
end;
end;

А что бы выключить компьютер, то команду
ExitWindowsEX(EWX_REBOOT,0); замени на
ExitWindowsEX(EWX_SHUTDOWN,0);
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 26.03.2008, 12:29   #7
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Код:
 
	function GetWinVersion: String; 
var 
   VersionInfo : TOSVersionInfo; 
   OSName      : String; 
begin 
   // устанавливаем размер записи
   VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo ); 

   if Windows.GetVersionEx( VersionInfo ) then 
      begin 
         with VersionInfo do 
         begin 
            case dwPlatformId of 
               VER_PLATFORM_WIN32s   : OSName := 'Win32s'; 
               VER_PLATFORM_WIN32_WINDOWS : OSName := 'Windows 95'; 
               VER_PLATFORM_WIN32_NT      : OSName := 'Windows NT'; 
            end; // case dwPlatformId 
            Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) + 
                      #13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')'; 
         end; // with VersionInfo 
      end // if GetVersionEx 
   else 
      Result := ''; 
end; 

procedure ShutDown; 
const 
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';   // Borland forgot this declaration 
var 
  hToken       : THandle; 
  tkp          : TTokenPrivileges; 
  tkpo         : TTokenPrivileges; 
  zero         : DWORD; 
begin 
  if Pos( 'Windows NT', GetWinVersion) = 1  then // we've got to do a whole buch of things 
     begin 
        zero := 0; 
        if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then 
           begin 
             MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK ); 
             Exit; 
           end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) 
        if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then 
           begin 
             MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK ); 
             Exit; 
           end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) 


        // SE_SHUTDOWN_NAME 
        if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then 
           begin 
              MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK ); 
              Exit; 
           end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid ) 
        tkp.PrivilegeCount := 1; 
        tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED; 

        AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero ); 
        if Boolean( GetLastError() ) then 
           begin 
              MessageBox( 0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK ); 
              Exit; 
           end // if Boolean( GetLastError() ) 
        else 
           ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 ); 
      end // if OSVersion = 'Windows NT' 
   else 
      begin // just shut the machine down 
        ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 ); 
      end; // else 
end;
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 26.03.2008, 12:36   #8
Патрон
Форумчанин
 
Аватар для Патрон
 
Регистрация: 07.03.2008
Сообщений: 151
По умолчанию

СПАСИБО ОГРОМНОЕ ВСЕМ! ВСЕ РАБОТАЕТ
Патрон вне форума Ответить с цитированием
Старый 26.03.2008, 16:24   #9
xakkkkker
Форумчанин
 
Аватар для xakkkkker
 
Регистрация: 15.12.2007
Сообщений: 226
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
А слабо использовать поиск по форуму со словом "перезагрузка"???
А зачем тогда форум если можно искать
xakkkkker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перезагрузка компа Pusher Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 19.02.2008 20:54
Выключение/Перезагрузка в Vista Veiron Общие вопросы Delphi 5 13.01.2008 09:35
Перезагрузка LAFam Win Api 13 09.12.2007 09:15
выключение, перезагрузка компьютера ATL Win Api 4 16.05.2007 01:57
выключение компьютера Svop Общие вопросы Delphi 23 18.12.2006 22:57