viernes, 24 de octubre de 2014

Simular VarPtr con Autoit

Como sabemos, AutoitScript es un lenguaje cuyas variables son de tipo Variante, no tienen un tipo de dato especifico, son representadas por el interprete, así que seria algo difícil obtener de alguna manera un puntero constante.

Yo no se como funcione el interprete de Autoit, pero puedo imaginar que:

1_ Son analizadas por primera vez como tipo de dato Cadena (Texto plano).
2_ Si son de tipo numerico (Entero por ejemplo), Son almacenadas en una variable de tipo entero.
3_ Vuelve al paso 1
4_ Si sus valores cambian de tipo numerico a cadena, son almacenadas en otra variable de tipo cadena.

esto puede ser complicado y hasta creo que me estoy llendo del tema principal, Asi que ire directo a la simulación de VarPtr.

Con lo explicado anteriormente puedo decir, que no es muy posible obtener un puntero de una variable variante de Autoit, por lo que hay que utilizar estructuras.

Se pueden declarar variables de tipos de datos nativos utilizando estructuras en Autoit (DllStructCreate).

Observen el siguiente codigo.

$Estructura = DllStructCreate("int")

Acabamos de declarar una variable, esta dentro de una estructura pero puede ser utilizada de manera indiferente a cualquier otra variable.

Modificaremos el código un poco ...

$Estructura = DllStructCreate("int;char[128]")

Ahora tenemos 2 variables de distintos tipos de datos nativos, Entero y Cadena. Podemos obtener el puntero individual de cada variable creada utilizando "DllStructGetPtr".

$Estructura = DllStructCreate("int;char[128]")
$Ptr = DllStructGetPtr($Estructura,1)
MsgBox(0,0,$Ptr)


¡Atención! El puntero obtenido es únicamente valido para Autoit (Formato binario: 0x000FFD3), pero puede ser convertido utilizando la función "Int".

$Estructura = DllStructCreate("int;char[128]")
$Ptr = DllStructGetPtr($Estructura,1)
MsgBox(0,0,Int($Ptr))

Llamar librerias Pauscal desde Autoit

Bienvenidos, hoy le mostrare como crear librerías DLL en Pauscal y llamarlas desde el lenguaje de programación AutoitScript.

Bien, Antes de comenzar les informo que tienen que saber lo básico de llamadas a dll en ambos lenguajes, "Proc" en Pauscal y "DllCall" en Autoit.

Comenzamos abriendo el IDE de Pauscal y creando una nueva biblioteca.


Como ejemplo, exportaremos un simple procedimiento que muestre un mensaje en pantalla, Ingresamos el siguiente código.

Importar "Utiles.prp" ' Importamos la librería que contiene el procedimiento "Mensaje"

Proc Msg(Contenido:Entero) Exportar ' Creamos un procedimiento, lo nombramos "Msg" y establecemos su primer parámetro como un Entero, finalmente Exportamos el procedimiento.
Mensaje(CadenaDePtrCad(Contenido)) ' Utilizamos el procedimiento "CadenaDePtrCad" para obtener la cadena desde el puntero que ingresa gracias a "DllCall" de Autoit.
FinProc ' Fin procedimiento


Una vez escrito el código, lo compilamos cliqueando en el botón que esta a la izquierda del botón verde mas llamativo.

Yo lo pondré en el escritorio y lo llamare "Dll".


Ahora creamos un Script de Autoit.


Lo abrimos con nuestro editor de texto de preferencia y le pegamos el siguiente código.

Dim $Var1
$Mensaje = "Mensaje"
$Var1 = DllCall("Dll.dll","none","Msg","str",$Mensaje)

Seguramente los que ya hayan probado la función "DllCall" en Autoit se preguntaran:

"¿Por Que le establecemos el parámetro 1 de tipo "Str" si es para Cadenas?"
"Ademas en Pauscal le establecimos el parámetro 1 de tipo Entero que es numérico"

Lo que hace el tipo de dato "Str" en Autoit es enviar un puntero a la cadena, se puede apreciar esta realidad en la documentación del lenguaje.


Si no mal recuerdo, LPCSTR significa "Puntero constante a Cadena" y LPSTR es "Puntero a Cadena", Por lo que nos indica que claramente envía un Puntero a la cadena que esta contenida en memoria y que sera obtenida por la librería gracias al procedimiento "CadenaDePtrCad" (Cadena de puntero a cadena).

Ejecutan el código y pueden visualizar claramente el mensaje.


¡Saludos!

Dll Export Viewer

Dll Export Viewer es un programa que nos permite obtener datos sobre las librerías DLL que exportan funciones.



Actualmente disponible en 23 idiomas, Nos ofrece el nombre de las funciones, su dirección y dirección relativa entre otros datos.

Ademas de lo anterior mencionado, nos ofrece exportar una lista de las funciones en HTML, buscarlas en Google o guardarlas en un archivo de texto plano.

Si quieres descargar este programa, puedes hacerlo desde la pagina web oficial.

www.nirsoft.net

Programación en español

Es un placer para mi anunciar la apertura de este nuevo blog, Si te gusta la programación pero estas harto del ingles, este es tu sitio!

Les informo que en este blog solo utilizare 3 lenguajes de programación:

Autoit
Pauscal
Visual Basic 6.0

Si necesitan algo sobre C++ o Java les recomiendo que busquen otro blog.

¡Saludos!