Consulta sobre el API de windows

User avatar
metaldrummer
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile
Contact:

Consulta sobre el API de windows

Post by metaldrummer »

Hola a todos:
Tengo el siguiente código:

Code: Select all

#include "hbclass.ch"
#include "fivewin.ch"

//definiciones para la forma de llamar a la dll
#DEFINE DC_CALL_CDECL		0x0010
#DEFINE DC_CALL_STD        0x0020

//definiciones para el apagado, rebooteo o cierre de sesión de windows
#DEFINE EWX_LOGOFF			0
#DEFINE EWX_POWEROFF    	0x00000008
#DEFINE EWX_REBOOT      	0x00000002
#DEFINE EWX_RESTARTAPPS    0x00000040
#DEFINE EWX_SHUTDOWN       0x00000001
#DEFINE EWX_FORCE          0x00000004
#DEFINE EWX_FORCEIFHUNG    0x00000010

FUNCTION Main()
	LOCAL nResult

	/*nDll  := DllLoad( "User32.dll" )
   pFunc := GetProcAddress( nDll, "ExitWindowsEx" )

   CallDll( pFunc, EWX_POWEROFF, EWX_FORCEIFHUNG )

   DllUnload( nDll )*/

	nResult:=DllCall( "User32.dll", DC_CALL_STD, "ExitWindowsEx", EWX_POWEROFF, EWX_FORCEIFHUNG)

RETURN NIL
El tema es que estoy intentando apagar el pc con esta rutina (como prueba) y no me funciona.
Si alguien me puede ayudar se lo agradecería de antemano
Mil gracias
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

David,

Prueba así:

DLL FUNCTION ExitWindowsEx( nFlags AS LONG, nReserved AS LONG ) AS BOOL PASCAL LIB "user32.dll"

aunque aqui no está funcionando. Quizá haya que codificarla en lenguaje C completamente.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
metaldrummer
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile
Contact:

Post by metaldrummer »

Antonio Linares wrote:David,

Prueba así:

DLL FUNCTION ExitWindowsEx( nFlags AS LONG, nReserved AS LONG ) AS BOOL PASCAL LIB "user32.dll"

aunque aqui no está funcionando. Quizá haya que codificarla en lenguaje C completamente.

Code: Select all

#include "hbclass.ch"
#include "fivewin.ch"

//definiciones para la forma de llamar a la dll
#DEFINE DC_CALL_CDECL		0x0010
#DEFINE DC_CALL_STD        0x0020

//definiciones para el apagado, rebooteo o cierre de sesión de windows
#DEFINE EWX_LOGOFF			0
#DEFINE EWX_POWEROFF    	8	//0x00000008
#DEFINE EWX_REBOOT      	2	//0x00000002
#DEFINE EWX_RESTARTAPPS    40	//0x00000040
#DEFINE EWX_SHUTDOWN       1	//0x00000001
#DEFINE EWX_FORCE          4	//0x00000004
#DEFINE EWX_FORCEIFHUNG    10	//0x00000010

FUNCTION Main()
	LOCAL nResult

	/*nDll  := DllLoad( "User32.dll" )
   pFunc := GetProcAddress( nDll, "ExitWindowsEx" )

   CallDll( pFunc, EWX_POWEROFF, EWX_FORCEIFHUNG )

   DllUnload( nDll )*/

	//nResult:=DllCall( "User32.dll", DC_CALL_STD, "ExitWindowsEx", EWX_POWEROFF, EWX_FORCEIFHUNG)
	IF MsgNoYes( "¿Desea apagar el equipo?", "Atención")
		nResult:=ExitWndEx( EWX_FORCEIFHUNG, 0)
		nResult:=ExitWndEx( EWX_SHUTDOWN, 0)
	ENDIF

	//nResult:=ExitWndEx( EWX_SHUTDOWN, 0)

RETURN NIL



DLL32 FUNCTION ExitWndEx( uFlags AS DWORD, dwRes AS DWORD ) AS BOOL PASCAL FROM "ExitWindowsEx" LIB "user32.dll"
Gracias por tu respuesta....
Ya lo había intentado
A mi no me funciona....que podrá ser?
Saludos y ojalá alguien me pueda ayudar....
Busqué la referencia del API de windows en microsoft.
Estoy pasando bien los parámetros
Mil gracias nuevamente
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

David,

Lo más sencillo es implementarla en lenguaje C completamente:

Code: Select all

//definiciones para el apagado, rebooteo o cierre de sesión de windows 
#DEFINE EWX_LOGOFF         0 
#DEFINE EWX_POWEROFF       8   //0x00000008 
#DEFINE EWX_REBOOT         2   //0x00000002 
#DEFINE EWX_RESTARTAPPS    40   //0x00000040 
#DEFINE EWX_SHUTDOWN       1   //0x00000001 
#DEFINE EWX_FORCE          4   //0x00000004 
#DEFINE EWX_FORCEIFHUNG    10   //0x00000010

function Main()

   ExitWindowsEx( nOr( EWX_SHUTDOWN, EWX_FORCEIFHUNG ) )

return nil

#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>

HB_FUNC( EXITWINDOWSEX )
{
   hb_retl( ExitWindowsEx( hb_parnl( 1 ), hb_parnl( 2 ) ) );
}

#pragma ENDDUMP
Usando EWX_LOGOFF funciona. Con otros valores parece que no.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
metaldrummer
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile
Contact:

Post by metaldrummer »

Antonio:
Te agradezco enormemente tu ayuda.
No funciona....quizás un detalle puede ser el SO (vista).

Además vi el poder usar el rundll32.exe user32.exe,exitwindows y lamentablemente vista ya no lo trae al igual que el winhlp32.exe

A ver si alguien más logra algo.

Es comencé el desarrollo de una aplicación para un cyber y es obvio que debe dar la capacidad de poder realizar este tipo de acciones en los pc's clientes.
Saludos
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
ARCC
Posts: 86
Joined: Sat Jun 24, 2006 4:27 pm
Location: Maracaibo - Zulia - Venezuela
Contact:

Post by ARCC »

Buen día para todos...

Que tal metaldrummer, disculpa pero tiene que ser a traves de API???, porque puedes hacerlo utlizando el comando Shutdown.exe -s -t 0, que es propio de Windows
Saludos,

Antonio Castro
Maracaibo - Venezuela
ant_cas@yahoo.com
User avatar
metaldrummer
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile
Contact:

Post by metaldrummer »

Lo que ocurre es que por ser una aplicación que maneja una parte servidor y otra cliente, debo permitir el poder apagar o cerrar la sesión en forma remota.
Voy a intentar lo que me dice de todos modos....gracias

shutdown estás en todas las versiones de windows?
Saludos
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
ARCC
Posts: 86
Joined: Sat Jun 24, 2006 4:27 pm
Location: Maracaibo - Zulia - Venezuela
Contact:

Post by ARCC »

Buen día para todos...
metaldrummer wrote:Lo que ocurre es que por ser una aplicación que maneja una parte servidor y otra cliente, debo permitir el poder apagar o cerrar la sesión en forma remota.
Voy a intentar lo que me dice de todos modos....gracias

shutdown estás en todas las versiones de windows?
Saludos
Si amigo, habre una sesión de MS-Dos y tipea Shutdown y presiona la tecla enter, allí veras todos los parámetro y hay uno el -m \\equipo que sirve para hacerlo vía remota, claro tienes que tener permiso para hacerlo
Saludos,

Antonio Castro
Maracaibo - Venezuela
ant_cas@yahoo.com
User avatar
metaldrummer
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile
Contact:

Post by metaldrummer »

ARCC wrote:Buen día para todos...
metaldrummer wrote:Lo que ocurre es que por ser una aplicación que maneja una parte servidor y otra cliente, debo permitir el poder apagar o cerrar la sesión en forma remota.
Voy a intentar lo que me dice de todos modos....gracias

shutdown estás en todas las versiones de windows?
Saludos
Si amigo, habre una sesión de MS-Dos y tipea Shutdown y presiona la tecla enter, allí veras todos los parámetro y hay uno el -m \\equipo que sirve para hacerlo vía remota, claro tienes que tener permiso para hacerlo
Funciona a las mil maravillas, probé a apagar y cerrar sesión y funciona ok.

Muchas gracias.
Además lo probé directamente a través de un RUN desde la aplicación y funciona perfecto....claro que si no me funcionó via API me complica el tema ya que tengo que utilizar el API para poder determinar las impresoras que tiene instalado el pc y autorizar o no su impresión, ver si se conectan o no dispositivos usb....y por cierto supongo que con el api se debe poder detectar cuando se desconecta el teclado, mouse, etc (para controlar los robos en el local), setear el fondo de pantalla, etc.
Debo seguir investigando rápidamente.
Saludos
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post by JmGarcia »

Lo he probado poniendo CERO en el segundo parámetro y ¡¡¡ FUNCIONA !!!

Los ejemplos que he visto por ahí lo ponen a CERO el 2º parámetro.

Ejejmplo VB:

Code: Select all

'------------Declarar esta funcion en un modulo...
Declare Function ExitWindowsEx& Lib "user32" (ByVal uFlags&, ByVal dwReserved&)
Public Const EWX_LOGOFF = 0
Public Const EWX_SHUTDOWN = 1
Public Const EWX_REBOOT = 2
Public Const EWX_FORCE = 4
'-----------------------
lresult = ExitWindowsEx(EWX_REBOOT, 0&)   '---- Reinicia el sistema
lresult = ExitWindowsEx(EWX_SHUTDOWN, 0&)   '---- Apaga el sistema
Otros ejemplos:

Code: Select all

Call ExitWindowsEX(1,0) --> Reinicia (creo)
Call ExitWindowsEX(2,0) --> Apaga
Call ExitWindowsEX(6,0) --> FOrzado

Code: Select all

Private Declare Function ExitWindowsEx& Lib "user32" (ByVal uFlags&, ByVal dwReserved&)
i = ExitWindowsEx(1, 0&)
i = ExitWindowsEx(0, 0&)
i = ExitWindowsEx(2, 0&)
Como se puede ver el segundo parámetro esta siempre a CERO.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

JM,

En Vista no funciona :-(
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post by JmGarcia »

Antonio Linares wrote:En Vista no funciona :-(
Yo lo he probado en XP y Win2000.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
User avatar
metaldrummer
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile
Contact:

Post by metaldrummer »

JmGarcia wrote:
Antonio Linares wrote:En Vista no funciona :-(
Yo lo he probado en XP y Win2000.
Gracias a Antonio, he conseguido que me funcione en Vista de la siguiente forma (solamente logoff):

Code: Select all

#include "hbclass.ch"
#include "fivewin.ch"

//definiciones para el apagado, rebooteo o cierre de sesión de windows
#DEFINE EWX_LOGOFF			0
#DEFINE EWX_POWEROFF    	8	//0x00000008
#DEFINE EWX_REBOOT      	2	//0x00000002
#DEFINE EWX_RESTARTAPPS    40	//0x00000040
#DEFINE EWX_SHUTDOWN       1	//0x00000001
#DEFINE EWX_FORCE          4	//0x00000004
#DEFINE EWX_FORCEIFHUNG    10	//0x00000010

FUNCTION Main()
	LOCAL nResult

	IF MsgNoYes( "¿Desea apagar el equipo?", "Atención")
		ExitWindowsEx( nOr( EWX_LOGOFF, 0 ) )
	ENDIF

RETURN NIL


#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>

HB_FUNC( EXITWINDOWSEX )
{
   hb_retl( ExitWindowsEx( hb_parnl( 1 ), hb_parnl( 2 ) ) );
}

#pragma ENDDUMP
Estudiando un poco al comando shutdown.exe veo que al darle el parámetro /r (reinicio) o /s (apagado) debe ir acompañado del parámetro /t xx (segundos a esperar para dicha acción). Supongo que en vista esto es obligatorio y claro está que con este procedimiento al no pasar parámetros obviamente que no lo ejecuta.

Por el momento utilizando shutdown.exe con el comando RUN funciona perfecto. Sí un alcanze: se debe colocar toda la ruta a shutdown.exe ya que RUN no respeta la variable PATH del S.O.
Saludos
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post by JmGarcia »

metaldrummer wrote:Por el momento utilizando shutdown.exe con el comando RUN funciona perfecto. Sí un alcanze: se debe colocar toda la ruta a shutdown.exe ya que RUN no respeta la variable PATH del S.O.
Saludos
Utiliza el RemoteShell.

Code: Select all

oRemoteShell:=CreateObject("WScript.Shell")
oRemoteShell:Run("ShutDown -s -m \\NombrePC",0,.F.)
oRemoteShell:=nil
metaldrummer wrote:...he conseguido que me funcione en Vista de la siguiente forma (solamente logoff):
Efectivamente, se me olvido decir que solo me funciona el LOGOFF.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
User avatar
metaldrummer
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile
Contact:

Post by metaldrummer »

JmGarcia wrote:
metaldrummer wrote:Por el momento utilizando shutdown.exe con el comando RUN funciona perfecto. Sí un alcanze: se debe colocar toda la ruta a shutdown.exe ya que RUN no respeta la variable PATH del S.O.
Saludos
Utiliza el RemoteShell.

Code: Select all

oRemoteShell:=CreateObject("WScript.Shell")
oRemoteShell:Run("ShutDown -s -m \\NombrePC",0,.F.)
oRemoteShell:=nil
metaldrummer wrote:...he conseguido que me funcione en Vista de la siguiente forma (solamente logoff):
Efectivamente, se me olvido decir que solo me funciona el LOGOFF.
El wscript.shell funciona de mil maravillas en vista y xp, y obviamente no aparece el pantallazo del run. Corre perfecto tanto para apagar, reiniciar, cerrar sesión, etc.
De donde obtienes toda esta información?
Algín link en particular?
Saludos y gracias por tu ayuda
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
Post Reply