• Publicidad

Obtener información de una función con Win32::API

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Obtener información de una función con Win32::API

Notapor ricar » 2009-08-07 01:51 @119

Hola a todos.

No sé si es la sección adecuada aunque espero que así sea.

Estoy intentando utilizar la API de Windows a través del módulo Win32::API. Sé que no funciona con todas las funciones de la API pero por si acaso...

Ejecuto la siguiente instrucción con el fin de obtener el LUID del sistema:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$prueba = Win32::API-> new("advapi32.dll", "AllocateLocallyUniqueId", P);
print "prueba: $prueba\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

y el resultado, es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
prueba: Win32::API=HASH(0x16261b0)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Una duda es: ¿me está dando un puntero, un error o qué? La otra es que si fuese un dato "utilizable", ¿cómo llamo al valor de la referencia (creo), "HASH(0x16261b0)"?

Saludos,
Ricar.
Última edición por explorer el 2009-08-08 21:50 @951, editado 1 vez en total
Razón: Ortografía, bloques de código
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Publicidad

Re: Obetner info de una función con Win32::API

Notapor netsoul » 2009-08-07 04:00 @208

Creo que faltaría esto si no me equivoco (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $return = $prueba->Call(3, 2);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Más información en Win32::API

;)
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Obetner info de una función con Win32::API

Notapor ricar » 2009-08-07 05:14 @260

Gracias, Netsoul aunque no doy con la solución.

No sé muy bien qué parámetro debo pasarle a Call. No es numérico, es un puntero pero no sé exactamente qué variable hay que pasar.

Muchas gracias por tu respuesta.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Obtener información de una función con Win32::API

Notapor explorer » 2009-08-08 21:59 @958

Pues eso depende de los argumentos que necesite la función llocateLocallyUniqueId.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener información de una función con Win32::API

Notapor ricar » 2009-08-24 02:04 @128

Hola a ambos (y al resto :wink: ).

Perdón por la ausencia pero he estado en otro planeta estas dos semanas, ¡¡¡¡no había Internet!!!!.

Creo que me he explicado mal, lo que no entiendo es la sintaxis del call y demás. Los argumentos a pasar los especifica claramente en el MSDN.

He encontrado un ejemplo (con otra función) para obtener el LUID:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$LookupPrivilegeValue = new Win32::API( 'AdvApi32.dll', 'LookupPrivilegeValue', [P,P,P], I ) || die;
$LookupPrivilegeValue->Call( "\x00\x00", $pszPriv, $pLuid );
print "Resultado 1: $LookupPrivilegeValue\n";
print "Resultado 2: $pLuid\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y obtengo lo siguiente como resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Resultado 1: Win32::API=HASH(0x1625f50)
Resultado 2: BS NUL NUL NUL NUL NUL NUL NUL NUL
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Como podéis comprobar no tengo mucha experiencia en esto del Perl y quizás haga preguntas demasiado básicas, pero para mí son obstáculos bastantes complejos.

Muchas gracias por vuestras respuestas.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Obtener información de una función con Win32::API

Notapor explorer » 2009-08-24 03:21 @181

Pues no entiendo la salida de la línea 2...

La de la salida 1 sí que la entiendo: dice que es un objeto Win32::API, basado en un diccionario (hash).

Yo entiendo lo siguiente: con Win32::API estás creando una llamada a una librería almacenada en la biblioteca del fichero dll. En los argumentos indicas cómo son los argumentos que debes enviar a la función y cómo es el argumento que devuelve (el tipo de argumento) (esto lo veo en la sinopsis del módulo Win32::API).

En el ejemplo, indicas que le vas a pasar 3 punteros (P), y que la función devolverá un entero (I).

Entonces, para hacer la llamada, sería así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $valor_retornado = $LookupPrivilegeValue->Call( "\x00\x00", $pszPriv, $pLuid );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y se supone que en $valor_retornado estará el resultado de la llamada a la función.

Tienes más ejemplos en la carpeta samples.

No he podido hacer las pruebas porque yo no uso Windows. A ver si alguien más te puede ayudar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener información de una función con Win32::API

Notapor ricar » 2009-08-24 04:22 @223

Hola Explorer.

Más o menos he llegado a la conclusión (con respecto a los parámetros) pero no me cuadra el número de argumentos a enviar, en teoría son dos de entrada (uno opcional) y devuelve uno, que sería un puntero.

De todas formas he logrador algo. En el mismo código hago un pack de la variable $pLuid cuando la declaro:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $pLuid= pack( "Ll", 0, 0 );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y cuando hago el unpack me sale como resultado un número entero. Imagino que voy por el buen camino pero lo tengo que comprobar.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $res=unpack( "Ll", $pLuid );
  2. print "Resultado 3: $res\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Resultado 3: 8
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Muchas gracias por vuestras respuestas.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Obtener información de una función con Win32::API

Notapor explorer » 2009-08-24 05:23 @266

Cuando en Win32::API se dice que debes pasar un argumento como puntero, solo es necesario pasar el nombre de la variable (no su referencia). Eso es lo que hace $pLuid en la llamada anterior. De esa forma la librería es capaz de devolver más valores que no solo el valor de retorno de la propia librería. Otra cosa es lo que diga la documentación de lo que significa lo que contenga la variable.

Con el empaquetado "Ll" estás indicando que estás empaquetando dos datos long (32 bits), uno con signo y otro sin signo.

Yo creo que entonces haces mal el desempaquetado, porque solo lees un valor. En contexto escalar -que es lo que has escrito-, unpack() devuelve el primer valor desempaquetado.

Bueno... todo depende de lo que realmente signifique el contenido de $pLuid. ¿Realmente es un doble largo lo que debe contener antes de la llamada? ¿Es un doble largo lo que devuelve? ¿Por qué te quedas solo con el primer largo?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener información de una función con Win32::API

Notapor ricar » 2009-08-24 06:03 @294

Hola de nuevo.

No sé exactamente si es doble largo o no lo que requiere. Por lo visto en los ejemplo (he obtenido números enteros hasta 22) no parece que haga falta. Aun así, lo he extraído de un ejemplo que he encontrado en Internet por lo que a lo mejor tiene un sentido que desconozco.

He comprobado, como bien dices, que pasa dos parámetros; el segundo, en todas las pruebas que he realizado, es siempre 0. Aun no sé la razón.

Muchas gracias por tus explicaciones. Voy viendo la luz, muy lejos, pero la veo :wink: .

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Obtener información de una función con Win32::API

Notapor explorer » 2009-08-24 06:21 @306

Según la página de msdn referida a la función AllocateLocallyUniqueId, espera como argumento un puntero a una estructura tipo LUID, que es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
typedef struct _LUID {
  DWORD LowPart;
  LONG  HighPart;
}LUID, *PLUID;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Así que ya sabes lo que devuelve: una doble palabra y un largo (total, 64 bits).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Módulos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado