Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Выключение компьютера посредством своей программы

Страницы: 1 2 След.
Выключение компьютера посредством своей программы
Как можно выключить компьютер программными средствами? Можно ли сделать это "безопасно" - с корректным завершением всех запущенных приложений?
Вот завалялся у меня такой код... Уже не припомню с какого ресурса...
Код
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)

    // 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;

К стати на Win 7 я не пробовал. Если попробуете, то напишите пожалуйста работает ли;)
Как все оказалось непросто. smile:( Спасибо, Valera. А под W7 потестить не смогу - у меня Xp.
Проверил на Win 7. РАБОТАЕТ!!!
Есть способ попроще. При помощи утилиты shutdown (лежит в папке system32);
Делаем так:
Код
WinExec('C:\WINDOWS\system32\shutdown.exe /s /t 0', sw_normal);

Параметр /t - это таймаут завершения работы (в описанном мной случае - 0 сек.)
Парамер /s - завершение работы.
Вы можете вместо /s поставить /r - тогда комп перезагрузится.

Эту информацию я нашел просто запустив утилиту shutdown.exe и прочитав справку по ней.
Изменено: mihail filatov - 23.06.2010 12:13:13
А в Win 7 это сработает?
Если есть возможность, протестируйте, пожалуйста.
Вообще-то этот способ не совсем подходит... Ведь rozpants спрашивал как выключить компьютер
Цитата
посредством своей программы
, а здесь получается что мы выключаем компьютер посредством чужой программы...
Изменено: Valera - 05.07.2010 13:08:10
Что-то не найду я этой цитаты. Изначально вопрос звучал
Цитата
rozpants пишет:
Как можно выключить компьютер программными средствами?
Цитата
Что-то не найду я этой цитаты.

Это название темы smile;)
Думаю, в данном случаи, использования программ поставляемых вместе с windows допустимо.
Я тоже так считаю. На крайний случай можно чужую программу зашить в свою и уже использовать как "самостоятельный" продукт.
Изменено: mihail filatov - 07.07.2010 04:28:20
Хм... Даже не знаю...
Это чтож получается? Если меня попросят сделать текстовый редактор (к примеру), то я могу смело писать программу в которой буду вызывать блокнот ну или WordPad, потому как эти программы входят в стандартную поставку Windows?
Ну нет, конечно. Тут прийдется самому расширять функционал. А shutdown.exe - это что-то вроде подключаемой библиотеки, которую может подключить любой желающий. Я думаю, нет ничего страшного в том, что другую мизерную программу можно вшить в свою.
Цитата
mihail filatov пишет:
можно вшить в свою.

как это "Вшить"?
Цитата
как это "Вшить"?

Я думаю mihail filatov имеет ввиду инсталлировать чужую программу вместе со своей и вызывать по необходимости...
Так удобней и вес программы меньше, а пользователю без разницы как выключится.
Изменено: mihail filatov - 03.08.2010 16:17:56
Да. Выключение так это понятная вещь. А вот кто знает как включить компьютер с помощью програмки)) smile:D smile:)
это невозможно)
Зато можно включить компьютер по сети smile:)
почему можно. Например вставит какую нибудь плату в материнскую карту которая включает компьютер дистанционно с пульта - модернизировать ее и поставить по таймеру- таймер задается через программу и передает ее этому прибору в котором есть память. И всё комп выключается и проходит это время которое мы передали и вооля комп включился? Токо это очень задротско но прикольно. Не осуждайте строго.
это уже не с помощью программки...
Можно вместо такого устройства использовать перепрошитый маршрутизатор.
А почему нельзя просто использовать функцию выключения компа? разве не сохраняются данные?
Там всего пару строчек кода, уже не вспомню.
Цитата
mihail filatov пишет:
А почему нельзя просто использовать функцию выключения компа? разве не сохраняются данные?
Там всего пару строчек кода, уже не вспомню.

Почему нельзя? можно smile:) Просто разговор ушел о том как его включить, а не выключить=)
Страницы: 1 2 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)