jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 16 févr. 2006 à 17:20
il y a aussi le code de rylryl:
if FileExists('c:\NTDETECT.COM') then
begin
ShellExecute(Form1.Handle,Nil,'C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE','0 /DELAY:0 /POWERDOWN','',sw_hide);
close ;{XP}
end
else
ShellExecute(Form1.Handle,Nil,'C:\Windows\RunDll.exe','C:\Windows\System\User.exe,exitWindows','',sw_hide);
close; {9x}
end;
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 16 févr. 2006 à 19:43
begin
if IsWinNT then SetPrivilegeNT;
ItWorked:= ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF , 0); // XP
if not ItWorked then
ShowMessage ('Shutdown impossible');
end;
et les 2 fonctions qui vont bien.
//--------------------------------------------------------
function IsWinNT : Boolean;
var MyOS: TOSVersionInfo;
begin
// Nécessaire de différencier Win NT des autres os
MyOS.dwOSVersionInfoSize := Sizeof(MyOS);
GetVersionEx(MyOS); result :(MyOS.dwPlatformId VER_PLATFORM_WIN32_NT);
end;
//--------------------------------------------------------
procedure SetPrivilegeNT;
var sTokenIn,sTokenOut : TTOKENPRIVILEGES ;
dwLen : DWORD ;
hCurrentProcess,hToken : THANDLE ;
Luid1 : TLargeInteger ;
begin
try
hCurrentProcess := GetCurrentProcess ;
//ajuste les privilèges, c ce ki est necessaire pour windows XP
OpenProcessToken (hCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
LookupPrivilegeValue(nil,'SeShutdownPrivilege',Luid1) ;
sTokenIn.PrivilegeCount := 1;
sTokenIn.Privileges[0].Luid := Luid1;
sTokenIn.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,sTokenIn,sizeof(TTOKENPRIVILEGES),sTokenOut,dwLen);
CloseHandle (hToken);
finally
application.ProcessMessages;
end;
end;
Et là, c'est blindé quelle que soit la version de zindos win 9x/2k/xp/etc etc (vista, je sais pas)
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 16 févr. 2006 à 23:40
Tu sais pô lire toi :D
j'ai tapé : ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF , 0)
Tiens, v'la ce que dit le MSDN (carrement + fiable....)
EWX_SHUTDOWN (0x00000001) :
Shuts down the system to a point at which it is safe to turn off the power. All
file buffers have been flushed to disk, and all running processes have stopped.
The calling process must have the SE_SHUTDOWN_NAME privilege. For more
information, see the following Remarks section.
Specifying this flag will not turn off the power even if the system supports
the power-off feature. You must specify EWX_POWEROFF to do this.
Windows XP SP1: If the system supports the power-off
feature, specifying this flag turns off the power.Et Vlan !
Quand au reboot , perso j'essaierai ca: ExitWindowsEx(EWX_REBOOT or EWX_FORCEIFHUNG, 0)
DeltaFX je ne dis pas cela sans raison : va voir les sites
http://phidels.com/php/index.php3 et la source de fabiin sur delphifr (serieux je ne sais meme pas comment on peut oser faire une telle source aussi bien au niveau du contenu que du contenant).
Maintenant DeltaFX reste zen, cela ne te visait pas c''était juste une précision : Fait sur google Eteindre PC et tu vas voir le nombre de fois ou tu vas voir sans la moindre précision et SANS RIEN D'AUTRE :
Procedure TForm1.EteindrePC ;
begin
ExitWindowsEx(EWX_SHUTDOWN, 0);
end;
end.
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 17 févr. 2006 à 00:27
Oh je suis zen, je me sens pas visé.
Je comprend pas ta remarque par rapport à Phidels.com, il liste 2 méthodes (datées de 2000, XP était peu répandu.....),
Une non compatible NT : ExitWindowsEx(EWX_SHUTDOWN, 0), celle qui te mets en boule, et pourtant c'est clair c'est écrit "non compatible NT" or XP est un derivé de NT
Et une compatible NT,donc avec selection de l'OS, et EWX_SHUTDOWN {or EWX_FORCE} et malheureusement c'est resté en commentaire, le EWX_FORCE. ( et ca aurait du etre forceifhung, pour faire bien barbare).
Le principal truc a retenir, c'est dès qu'on voit un nom de commande où y a window dedans, faut systématiquement aller lire le MSDN, avant d'accorder la moindre confiance à un source.
Apres une lecture du MSDN, on rajoute "or EWX_PowerOFF" au cul de EWX_SHUTDOWN or EWX_FORCE, et hop.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 17 févr. 2006 à 02:15
Salut,
@ Francky : le mieux dans ce cas c'est tester soit même et surtout avant d'affirmer quoi que ce soit.
Tu as beaucoup de chance je l'ai fait pour toi
alors voici ce que j'ai testé :
ExitWindowsEx(EWX_SHUTDOWN , 0); // et ça fonctionne très très bien sous XP SP2 avec les droits d'Administrateur
et :
ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF , 0); // fonctionne également ( mais ça parait logique n'est il pas ?)
Et je précise aussi que, les deux versions coupent l'alimentation (Si le PC gère l'APM bien sur ). Un Shut Down propre quoi.
Donc on ne peut même pas faire confiance au MSDN
Un petit conseil qui ne mange pas de pain :
Ne pas prendre pour argent comptant tous ce que l'on peut lire ici et la sur le net où ailleurs
TESTEZ VOUS MÊME
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 17 févr. 2006 à 09:13
salut,
MSND signifie: Microsoft Developer Network c'est la réfrence des systemes Windows
pour la source que tu cites si tu l'as regardée c'est la même chose que ce que te donne DeltaFx:
ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF , 0);
il y a quand même une chose à vérifier est ce cette fonction laisse aux
autres programmes la possibilité de se fermer proprement ( closequery)
surtout dans la cas ou des modifications de données doivent
enregistrées?
guigui265
Messages postés113Date d'inscriptionmercredi 29 novembre 2000StatutMembreDernière intervention16 avril 2006 17 févr. 2006 à 09:23
C'est vrai que ca peut etre dangereux, mais cela dépend comment on l'utilise! si l'on sait ce que fait cette appli,on prend des précautions, mais si on l'utilise en trompant un tiers, c'est différent!
J'ai tenu compte de vos remarques, et je suis arrivé a quelque chose, qui marche très bien, sur mon pc XP SP2, je n'ai pas de pc avec un autre os!
merci a tous
guillaume
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 17 févr. 2006 à 09:51
Ce qui est chiant quand on développe, c'est cette foison de systemes zindoz 32-bits, faut soit penser à chaque system possible, soit restreindre les compatibilités. Rien que controler WindowMediaPlayer (pas Tmediaplayer ) c'est la mort, y a le 6.4.07, le 7.1, le 8.1, le 9, le 10.... chacun avec ses trucs et bizarrerie.
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 17 févr. 2006 à 09:52
j'ai testé il ferme bien les applis avec closequerry
mais pour XP ma fonction est plus simple (une seule ligne) encore qu'en
la remettant seule sur un form le compilateur ne retrouve pas la
fonction WindowsRep() il a fallu que je lui spécifie le chemin :
'c:\windows\system32\shutdown.exe -s -f -t 00'
là je n'est pas tout compris si vous avez une explication je suis preneur!
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 17 févr. 2006 à 22:43
le but est d'appuyer sur un boutton pour arreter le pc sans passer par la confirmation ?
j'ai encore plus simple pour toi :
appuis sur le boutton "Power" de ta tour pendant 4 secondes ... ton pc s'etteindras sans corrompre le systeme.
<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 17 févr. 2006 à 22:54
oui mais si tu n'as pas sauvegardé ton travail
ben ... c'est perdu
Et c'est pas windows qui coupe mais c'est le Bios du PC qui permet cela.
Donc pour le faire depuis une application Delphi
c'est maron
Snif