Disculpa que te moleste con una pregunta tan sencilla pero no logro hacer que mi ordenador se reinicie desde una aplicación hecha en delphi ¿Cómo hacerlo?
Básicamente aunque suena sencilla la pregunta, una vez sentí la curiosidad y me la hice; para darte un poco de explicación de como funciona Windows en cuanto a un LOGOFF User; existen tres LOGOFF 1- Terminar sesión 2- Reiniciar sistema 3- Apagar; Entre en internet por esos timpos, ya sabia que el pagado de sistema dependía de una función propia de windows, pero esta esta supeditada los privilegios que como usuario o administrador tenga la aplicación que esta corriendo, lo que pude encontrar fue una aplicación visual basic que luego pase a delphi, V4 en ese entonces y me funciono bien, de hecho la uso para apagar el pc desde una unidad de control remoto. Estas rutinas manejan los tres tipos de LOGOFF de windows para programadores. function GetCurrentProcess:THandle; stdcall;external 'kernel32.dll'; function OpenProcessToken(ProcessHandle:THandle;DesiredAccess:DWord; TokenHandle:PHandle):bool; stdcall;external 'advapi32.dll'; procedure EnableShutDown(); var hProc : THandle; hToken : THandle; mLUID : int64; mPriv : TOKEN_PRIVILEGES; mNewPriv: TOKEN_PRIVILEGES; mVar : DWord; begin hProc := GetCurrentProcess; OpenProcessToken(hProc,TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY,@hToken); LookupPrivilegeValue(Pchar(''),Pchar('SeShutdownPrivilege'), mLUID); mPriv.PrivilegeCount := 1; mPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; mPriv.Privileges[0].Luid := mLUID; mVar := 4 + (12 * mNewPriv.PrivilegeCount); AdjustTokenPrivileges(hToken, False, mPriv, 4 + 12 * mPriv.PrivilegeCount, mNewPriv,mVar) end; function IsWinNT():Boolean; var myOS:OSVERSIONINFO; begin myOS.dwOSVersionInfoSize:=sizeof(myOS); GetVersionEx(myOS); IsWinNT:=(myOS.dwPlatformId = VER_PLATFORM_WIN32_NT) end; procedure ShutDownNT(Force:Boolean); var Flags : Longint; begin Flags := EWX_SHUTDOWN; If Force Then Flags := Flags + EWX_FORCE; If IsWinNT Then EnableShutDown; ExitWindowsEx(Flags, 0) end; procedure RebootNT(Force:Boolean); var Flags : Longint; begin Flags := EWX_REBOOT; If Force Then Flags := Flags + EWX_FORCE; If IsWinNT Then EnableShutDown; ExitWindowsEx(Flags, 0) end; procedure LogOffNT(Force:Boolean); var Flags : Longint; begin Flags := EWX_LOGOFF; If Force Then Flags := Flags + EWX_FORCE; If IsWinNT Then EnableShutDown; ExitWindowsEx(Flags, 0) end; //---- Cópialas en tu aplicación y Usalas. Éxitos. Ing. Mec. Luis Delgado