Visual Basic - ExitWindowsEx

Life is soft - evento anual de software empresarial
 
Vista:

ExitWindowsEx

Publicado por ontee (6 intervenciones) el 01/10/2005 01:34:58
Hola.
Estoy intentando hacer un pequeño programa que apage el pc cuando le indico una hora de terminada, intento utilizar la funcion ExitWindowsEx de la libreria user32 pero no me funciona

la funcion la llamo de la siguiente manera:
Resultado = ExitWindowsEx(8, 0)

Uso Windows XP, puede deberse a algun tipo de configuracion de mi xp?
Alguine me puede ayudar?
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:ExitWindowsEx

Publicado por jose carlos (340 intervenciones) el 01/10/2005 11:46:09
yo lo tengo hecho de esta manera

ejecuta = "c:\windows\rundll32.exe Shell32,SHExitWindowsEx 13"
Shell (ejecuta)

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ExitWindowsEx

Publicado por jlcastro (186 intervenciones) el 01/10/2005 11:53:34
Apagar el equipo, reiniciar Windows, reiniciar el Sistema:

Añadir tres botones a un formulario y escribir lo siguiente en el código del formulario:

Private Declare Function ExitWindowsEx& Lib "user32" (ByVal
uFlags&, ByVal dwReserved&)

Private Sub Command1_Click()
Dim i as integer
i = ExitWindowsEx(1, 0&) 'Apaga el equipo
End Sub

Private Sub Command2_Click()
Dim i as integer
i = ExitWindowsEx(0, 0&) 'Reinicia Windows con nuevo usuario
End Sub

Private Sub Command3_Click()
Dim i as integer
i = ExitWindowsEx(2, 0&) 'Reinicia el Sistema
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Mira este código

Publicado por Zoto (41 intervenciones) el 01/10/2005 13:09:36
Buenas ontee.

Para apagar el sistema con la API ExitWindowsEx y que tenga efecto, primero debes tomar los privilegios necesarios para hacerlo.

Yo también usé hace tiempo esta API, junto con una función para tomar los privilegios para usarla.
Aquí te doy el código.

Simplemente, pégalo en un módulo. Abajo te muestro como se usa.

'-------------------------------------------------------------------------------------------------
'CÓDIGO
-------------------------------------------------------------------------------------------------

'--------------------------------------
'CÓDIGO PARA APAGAR/REINICIAR WINDOWS
'Zoto - lawebdelprogramador.com -> Visual Basic
'--------------------------------------

'Tipos necesarios
Private Type LUID
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type

'Constantes
Private Const EWX_SHUTDOWN As Long = 1 'Apagar equipo
Private Const EWX_FORCE As Long = 4 'Forzar aplicaciones a cerrar
Private Const EWX_REBOOT = 2 'Reiniciar equipo

'APIs
Private Declare Function ExitWindowsEx Lib "user32" ( _
ByVal dwOptions As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" _
(ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" _
(ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" _
(ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, _
NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _
PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long

'Función para adquirir los privilegios para usar la API ExitWindowsEx
Public Sub AdjustToken()
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2

Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long

hdlProcessHandle = GetCurrentProcess()
OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
tkp.PrivilegeCount = 1
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded
End Sub

'Ejemplo de uso (APAGAR EL SISTEMA):-----------------------------------------

'AdjustToken 'Se toman los privilegios
'ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE), &HFFFF 'Se apaga el equipo
'----------------------------------------------------------------------------

'-------------------------------------------------------------------------------------------------
'CÓDIGO
-------------------------------------------------------------------------------------------------

____________________

Espero que este código te sea efectivo para realizar lo que pides.
Si tienes alguna duda o problema con él, coméntalo.

Hasta la próxima.

Zoto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

no funca el codigo

Publicado por Koflax (7 intervenciones) el 02/10/2005 04:50:26
hola Zoto

estaba de pasada y vi este codigo ke colocaste... a mi no me funca me tira un error de compilacion y sinceramente no cacho ke onda... me sale
"Error de compilacion:

Los comentarios solamente pueden aparecer despues de End Sub, end function o end property"

bueno eso... si pudieces ayudarme se te agradeceria...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funciona bien, creo...

Publicado por Zoto (2 intervenciones) el 03/10/2005 00:06:36
Hola Koflax.

El código, personalmente, me funciona bien.
Pero el error que dices que te da es de compilación, es decir, que no se trata de que el código funcione o no, sinó de la posición y de la escritura del mismo.

El error de compilación que te da, que, según has dicho, es el siguiente:

---------------------------
Microsoft Visual Basic
---------------------------
Error de compilación:

Los comentarios solamente pueden aparecer después de End Sub, End Function o End Property
---------------------------
Aceptar Ayuda
---------------------------

aparece cuando alguna declaración no se encuentra en el inicio del código, en cabeza, es decir, cuando una declaración se encuentra entre medio del código (entre variables globales, constantes, procedimientos, funciones...).
Las declaraciones deben posicionarse siempre en el cabezal del código.

Lo que seguramente te ocurre es que has copiado el código que he escrito en el mensaje directamente a continuación de otro que ya tenías hecho, con lo cual, las declaraciones del mío han quedado entre el código (no arriba del todo, como deberían) y como consecuencia, Visual Basic da un error de compilación.

Lo que te recomiendo es que añadas un nuevo módulo al proyecto y que pegues en él mi código. Intenta añadir siempre nombres que informen sobre el contenido del módulo, por ejemplo, a este le podrías llamar mdShutdown (md para indicar que es un módulo, bueno así acostumbro ya ha hacerlo...).

De esta manera, tus códigos quedarán más ordenados y estructurados y serán más fáciles de depurar en caso de problemas.
Solo es un simple consejo.

Bueno, espero que con esto te desaparezca el problema, Koflax y que te sirva mi código.

Si tienes más problemas, comunícalo aquí.

Hasta la próxima.

Zoto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funciona bien, creo...

Publicado por Koflax (7 intervenciones) el 03/10/2005 18:01:56
hola Zoto

lo tenia en un modulo y no me funciono... pero lo puse ahora al comienzo de un formulario... y me funciono...

GRACIAS MAESTRO!!!

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar