Paulo Nobre Postado Setembro 10, 2004 Denunciar Share Postado Setembro 10, 2004 Alguém pode ajudar?Quem já tentou escrever um código para desligamento do windowsde dentro de um programa poderá ter tido algum problemapara desligar o windows XP, devido as restrições do usuário.Isso se resolve usando a função:function WinExit(flags: integer): boolean; function SetPrivilege(privilegeName: string; enable: boolean): boolean; var tpPrev, tp : TTokenPrivileges; token : THandle; dwRetLen : DWord; begin result := False; OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token); tp.PrivilegeCount := 1; if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then begin if enable then tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else tp.Privileges[0].Attributes := 0; dwRetLen := 0; result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen); end; CloseHandle(token); end;begin if SetPrivilege('SeShutdownPrivilege', true) then begin ExitWindowsEx(flags, 0); SetPrivilege('SeShutdownPrivilege', False) end; winExit:= True;end;//A função acima desliga o windows//**************************************************************************Aí, num botão de comando ou num menubasta digitar o código:WinExit(EWX_POWEROFF); E o PROBLEMA ESTÁ RESOLVIDO.O problema é que no windows 98 nada acontece.Alguém sabe como resolver este problema, ou seja, um código que desligue os dois sistemas operacionais.Tentei,WinExit(EWX_POWEROFF or EWX_SHUTDOWN OR EWX_FORCE);E TODAS AS COMBINAÇÕES POSSíveis e nada acontece no 98.Observe que EWX_POWEROFF tem que ter para fechar totamente o XP.Alguma ajuda?PS: Quem forneceu o código da função foi um colaborador deste forum, o s3c, aliás onde anda o s3c?Paulo Nobre Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Setembro 11, 2004 Autor Denunciar Share Postado Setembro 11, 2004 Resolvido, pode fechar.Verifico qual é a plataforma com um if.Se for xp, uso o código acima , caso contrário uso a função winexitex, que funciona no 98.Paulo Nobre Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Paulo Nobre
Alguém pode ajudar?
Quem já tentou escrever um código para desligamento do windows
de dentro de um programa poderá ter tido algum problema
para desligar o windows XP, devido as restrições do usuário.
Isso se resolve usando a função:
function WinExit(flags: integer): boolean;
function SetPrivilege(privilegeName: string; enable: boolean): boolean;
var
tpPrev, tp : TTokenPrivileges;
token : THandle;
dwRetLen : DWord;
begin
result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token);
tp.PrivilegeCount := 1;
if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then
begin
if enable then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
dwRetLen := 0;
result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen);
end;
CloseHandle(token);
end;
begin
if SetPrivilege('SeShutdownPrivilege', true) then
begin
ExitWindowsEx(flags, 0);
SetPrivilege('SeShutdownPrivilege', False)
end;
winExit:= True;
end;
//A função acima desliga o windows
//**************************************************************************
Aí, num botão de comando ou num menu
basta digitar o código:
WinExit(EWX_POWEROFF); E o PROBLEMA ESTÁ RESOLVIDO.
O problema é que no windows 98 nada acontece.
Alguém sabe como resolver este problema, ou seja, um código que desligue os dois sistemas operacionais.
Tentei,
WinExit(EWX_POWEROFF or EWX_SHUTDOWN OR EWX_FORCE);
E TODAS AS COMBINAÇÕES POSSíveis e nada acontece no 98.
Observe que EWX_POWEROFF tem que ter para fechar totamente o XP.
Alguma ajuda?
PS: Quem forneceu o código da função foi um colaborador deste forum, o s3c, aliás onde anda o s3c?
Paulo Nobre
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados