Page 1 of 2

Consulta sobre el API de windows

PostPosted: Wed Mar 12, 2008 10:05 pm
by metaldrummer
Hola a todos:
Tengo el siguiente código:
Code: Select all  Expand view
#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

PostPosted: Thu Mar 13, 2008 12:06 am
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.

PostPosted: Thu Mar 13, 2008 12:13 am
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  Expand view
#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
Code: Select all  Expand view

PostPosted: Thu Mar 13, 2008 9:58 am
by Antonio Linares
David,

Lo más sencillo es implementarla en lenguaje C completamente:
Code: Select all  Expand view
//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.

PostPosted: Thu Mar 13, 2008 1:51 pm
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

PostPosted: Thu Mar 13, 2008 2:59 pm
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

PostPosted: Thu Mar 13, 2008 7:33 pm
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

PostPosted: Thu Mar 13, 2008 7:48 pm
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

PostPosted: Thu Mar 13, 2008 8:23 pm
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

PostPosted: Thu Mar 13, 2008 9:45 pm
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  Expand view
'------------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  Expand view
Call ExitWindowsEX(1,0) --> Reinicia (creo)
Call ExitWindowsEX(2,0) --> Apaga
Call ExitWindowsEX(6,0) --> FOrzado
Code: Select all  Expand view
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.

PostPosted: Thu Mar 13, 2008 9:59 pm
by Antonio Linares
JM,

En Vista no funciona :-(

PostPosted: Fri Mar 14, 2008 8:49 am
by JmGarcia
Antonio Linares wrote:En Vista no funciona :-(

Yo lo he probado en XP y Win2000.

PostPosted: Fri Mar 14, 2008 4:07 pm
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  Expand view
#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

PostPosted: Fri Mar 14, 2008 5:16 pm
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  Expand view
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.

PostPosted: Fri Mar 14, 2008 6:30 pm
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  Expand view
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