FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Consulta sobre el API de windows
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Consulta sobre el API de windows
Posted: Wed Mar 12, 2008 10:05 PM
Hola a todos:
Tengo el siguiente código:
#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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Consulta sobre el API de windows
Posted: Thu Mar 13, 2008 12:06 AM

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
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Consulta sobre el API de windows
Posted: Thu Mar 13, 2008 12:13 AM
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.


#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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Consulta sobre el API de windows
Posted: Thu Mar 13, 2008 09:58 AM
David,

Lo más sencillo es implementarla en lenguaje C completamente:
//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
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Consulta sobre el API de windows
Posted: Thu Mar 13, 2008 01:51 PM

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
Posts: 86
Joined: Sat Jun 24, 2006 04:27 PM
Consulta sobre el API de windows
Posted: Thu Mar 13, 2008 02:59 PM

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
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Consulta sobre el API de windows
Posted: Thu Mar 13, 2008 07:33 PM

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
Posts: 86
Joined: Sat Jun 24, 2006 04:27 PM
Consulta sobre el API de windows
Posted: Thu Mar 13, 2008 07:48 PM
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
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Consulta sobre el API de windows
Posted: Thu Mar 13, 2008 08:23 PM
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
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Consulta sobre el API de windows
Posted: Thu Mar 13, 2008 09:45 PM
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:
'------------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:
Call ExitWindowsEX(1,0) --> Reinicia (creo)
Call ExitWindowsEX(2,0) --> Apaga
Call ExitWindowsEX(6,0) --> FOrzado
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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Consulta sobre el API de windows
Posted: Thu Mar 13, 2008 09:59 PM

JM,

En Vista no funciona :-(

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Consulta sobre el API de windows
Posted: Fri Mar 14, 2008 08:49 AM
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
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Consulta sobre el API de windows
Posted: Fri Mar 14, 2008 04:07 PM
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):

#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
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Consulta sobre el API de windows
Posted: Fri Mar 14, 2008 05:16 PM
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.
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
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Consulta sobre el API de windows
Posted: Fri Mar 14, 2008 06:30 PM
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.
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