PDA

Ver la Versión Completa : No puedo reiniciar windows desde mi aplicacion


gilberto_1126
28-09-2007, 18:34:03
Saludos foristas.

Necesito dejar programado Reiniciar una computadora.

tengo problemas con los permisos ya que no me ejecuta ninguna accion.

La hice con la finalidad de que trabaje con windows xp

Aqui les muestro el codigo que utilizo para los permisos


function TForm1.EnablePrivilege(PrivilegeName:PChar;Enable:Boolean):boolean;
var
TokenPriv: TOKEN_PRIVILEGES;
Luid:TLargeInteger;
HToken:THandle;
begin
Result:=FALSE;
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,HToken) then
if LookupPrivilegeValue(NIL,PrivilegeName,Luid) then
begin
TokenPriv.PrivilegeCount:=1;
TokenPriv.Privileges[0].Attributes:= Luid;
if Enable then
TokenPriv.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED
else
TokenPriv.Privileges[0].Attributes:=0;
Result:=AdjustTokenPrivileges(HToken, FALSE,TokenPriv,0,NIL,PDWORD(nil)^);
CloseHandle(HToken);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
EnablePrivilege('SeShutDownPrivilege',TRUE);
ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0);
end;


gracias por su tiempo

dec
28-09-2007, 19:19:38
Hola,

¿Pusiste un punto de ruptura en "FormDestroy"? Lo mismo es que no puedes "terminar" la aplicación de ese modo (si quieres pasar por el "FormDestroy"). Tal vez lo suyo sería usar el evento "OnCloseQuery" u "OnClose", simplemente, del formulario principal, y no usar "Terminate", sino el método "Close" del formulario principal.

O, puestos a llevar a cabo una acción en concreto... el "botón" podría ejecutar directamente lo necesario para reiniciar el sistema, y, acto seguido, cerrar la aplicación...

gilberto_1126
28-09-2007, 19:27:29
Gracias por responder Dec

Mira la llamada de la funcion la agregue al clic del boton y aun asi no hace nada.

dec
28-09-2007, 19:44:58
Hola,

Pues es raro. No es que revisase completamente la función que habilita los permisos necesarios, pero, yo diría que es muy similar (por no decir la misma) que yo mismo he usado alguna vez... sin problema alguno...

Deberías comprobar qué retornan las funciones implicadas, y, en caso de error, echar mano de algo como "GetLastError()", o "SysErrorMessage()", de modo que pudieras obtener algo más de información acerca del posible problema...

gilberto_1126
28-09-2007, 20:06:39
No tendra algo que ver que tengo instalado el service pack 2 de windows xp????

dec
28-09-2007, 20:19:12
Hola,

Pues no lo creo. Yo uso para apagar el sistema (luego de cierto tiempo) un programa escrito en C# (es cierto), en el que uso las mismas funciones que tú... y tengo instalado el Service Pack 2 de Windows XP.

gilberto_1126
28-09-2007, 20:20:20
le agregue un raise y me aparece el error 1314

que significa este error?

dec
28-09-2007, 20:36:30
Hola,

No entiendo lo del "raise". Supongo que usas "RaiseLastOSError()", pero,... da igual. En todo caso, según "SysErrorMessage()" el código de error que refieres tiene que ver con la falta de algún privilegio.

No sé si será debido a que usas una cuenta de usuario "no administrador"... En todo caso la solución no pasa por cambiar de usuario, sino por mirar los resultados de las funciones... yo comenzaría por revisar concienzudamente la ayuda de la función "ExitWindowsEx()", que tiene bastante tela que cortar...

cHackAll
29-09-2007, 23:27:49
Si es que no es mucho lio ver un mensaje propio del Güindos se me ocurre un:

WinExec('shutdown -s -f -t 3600', 0);

Saludos