Consulta sobre el API de windows

Consulta sobre el API de windows

Postby metaldrummer » Wed Mar 12, 2008 10:05 pm

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
[b]David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl[/b]
User avatar
metaldrummer
 
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile

Postby Antonio Linares » 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
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby metaldrummer » 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.


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
[b]David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl[/b]
User avatar
metaldrummer
 
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile

Postby Antonio Linares » Thu Mar 13, 2008 9:58 am

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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby metaldrummer » Thu Mar 13, 2008 1: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
[b]David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl[/b]
User avatar
metaldrummer
 
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile

Postby ARCC » Thu Mar 13, 2008 2: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
ARCC
 
Posts: 86
Joined: Sat Jun 24, 2006 4:27 pm
Location: Maracaibo - Zulia - Venezuela

Postby metaldrummer » Thu Mar 13, 2008 7: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
[b]David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl[/b]
User avatar
metaldrummer
 
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile

Postby ARCC » Thu Mar 13, 2008 7: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
ARCC
 
Posts: 86
Joined: Sat Jun 24, 2006 4:27 pm
Location: Maracaibo - Zulia - Venezuela

Postby metaldrummer » Thu Mar 13, 2008 8: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
[b]David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl[/b]
User avatar
metaldrummer
 
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile

Postby JmGarcia » Thu Mar 13, 2008 9: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:
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.
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
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Postby Antonio Linares » Thu Mar 13, 2008 9:59 pm

JM,

En Vista no funciona :-(
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby JmGarcia » Fri Mar 14, 2008 8: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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Postby metaldrummer » Fri Mar 14, 2008 4: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):

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
[b]David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl[/b]
User avatar
metaldrummer
 
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile

Postby JmGarcia » Fri Mar 14, 2008 5: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.
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.
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
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Postby metaldrummer » Fri Mar 14, 2008 6: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.
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
[b]David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl[/b]
User avatar
metaldrummer
 
Posts: 113
Joined: Wed Jan 10, 2007 8:43 pm
Location: Coquimbo-Chile

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 77 guests