Autor Tema: Resumen de dynawrap.dll port.dll - input32.dll  (Leído 3004 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado IAO

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 702
Resumen de dynawrap.dll port.dll - input32.dll
« en: 10 de Agosto de 2012, 10:43:33 »
Hola para todos...


Les había comentado sobre el DynaWrapper, que es una .dll que envuelve
a otras .dll y llamas las funciones que estan dentro de esa .dll que se quiere usar.

La idea principal para mi, es tratar de no usar más el MSCOM32.

Voy a tratar de ser puntual sin muchos detalles.
Parte es traducido y parte es mio.
Textos originales, colocar en el buscador de internet:
Using External DLL's in StealthBot.
An Automation Object for Dynamic DLL Calls.


Que vamos a necesitar.
======================
dynacall.dll
port.dll
inpout32.dll
saber un tantito de vbscript.



Dynawrap/dynacall DynaWrap.dll.
===============================
Su uso es un tanto enredado y voy a tratar de explicar con unos ejemplos.
Puedes descargarla aquí.
Citar
http://cwashington.netreach.net/site/downloads.html***
 http://www.doncullen.net/archives/dynawrapNT.zip*** (Creo que este es más seguro)
Deberías leer el .txt que está dentro del .zip

DynaWrap.dll
Esta librtería te permite llamar funciones de otras .dll
Una vez descargado, hay que registrar la dynacall.dll lo colocas en \windows\system32 (es lo mejor)
y registras así: regsvr32  C:\WINDOWS\system32\DynaWrap.dll


En VBScript creamos el objeto. (Se puede hacer con java, c/c++, delphi, vbs y otros cada uno con su método)
Código: [Seleccionar]
'''Esto es un equivalente a sleep en vbs
Dim UserWrap
Set UserWrap = CreateObject("DynamicWrapper")    ''' instanciamos dynawrap
'''Luego llamamos la dll que queremos utilizar con su funcion y parametros así:
UserWrap..Register "KERNEL32.DLL", "Sleep", "i=l", "f=s"  ''' no retorna valor
UserWrap.Sleep 5000   ''' 5 seconds


Otro ejemplo
Código: [Seleccionar]
' Calling vb's DoEvents now...
Dim oDW
Set oDW = CreateObject("DynamicWrapper")      ' Instantiate dynawrap
oDW.Register "MSVBVM50.DLL", "rtcDoEvents", "f=s"  ' No input or return value

oDW.rtcDoEvents      ' This is the equivalent of vb's "DoEvents"
addchat vbcyan, "...OK. you just executed a vb DoEvents statement."


Supongamos que entregan este código en VB con las APIs para convertir en VBScript.
Código: [Seleccionar]
Declare Function SetWindowPos Lib "user32" (ByVal hwnd _
As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, _
ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal _
wFlags As Long) As Long

Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal _
lpWindowName As String) As Long

Const SWP_HIDEWINDOW = &H80
Const SWP_SHOWWINDOW = &H40

Con las subrutinas de ese código anterior.
Código: [Seleccionar]
Sub HideTaskbar()
Dim Thwnd as Long
Thwnd = FindWindow("Shell_traywnd", "")
Call SetWindowPos(Thwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW)
End Sub

Sub ShowTaskbar()
Dim Thwnd as Long
Thwnd = FindWindow("Shell_traywnd", "")
Call SetWindowPos(Thwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW)
End Sub

Para convertir esto en VBS, primero nos enfocamos en los "Declare Function"
UserWrap.Register "user32.dll", "SetWindowPos", "i=lllllll", "f=s", "r=l"

Que pasó allí.
La API dice que el nombre de la librería en este caso es user32.dll,
y la abrimos así: UserWrap.Register "user32.dll"
Luego necesitamos el nombre de la funcion a utilizar y lo obtenemos así:
UserWrap.Register "user32.dll", "SetWindowPos"
Si aparece un alias en la API, usar el alias más en lugar del nombre de la función.

Pero esa "i=lllllll" ¿Qué es?
Mirando la API podrás ver los argumentos que son 7. Siete argumentos
del tipo long por eso la "l" de long.
UserWrap.Register "user32.dll", "SetWindowPos", "i=lllllll"
Las letras de los argumentos deben mantener el mismo orden. Si tuvieramos
un string, string, double, long, string en ese exacto orden deberíamos
escribir "i=ssdls"

Puede que la API no tenga argumentos ni retorno entonces se omite la "i=" y la "r="
quedaría así: oDW.Register "MSVBVM50.DLL", "rtcDoEvents", "f=s"  ' No input or return value

La "f=s" es un standar que cambia solamente si la librería fue creada con Borland C++,
normalmente "f=s" debería trabajar bien.

la ultima parte "r=l". Mirando al final de la API podrás ver que dice "As long" esto
nos indica que retornará un valor del tipo Long. long = l de allí "r=l".

Resumiendo.
Abrimos la librería, luego la función de la librería, los argumentos de la librería (se saca la  informacion de la APIi)
Entonces sería como esto:
variable Register "DllName.dll", "FunciónName", "i=ArgumentsVarTypes", "f=s", "r=ReturnVarType"

Código: [Seleccionar]
Constantes o flags para los  Tipo de Argumentos  
'a', (IDispatch*),    // a   IDispatch*
'c', (unsigned char), // c   signed char  
'd', (double),        // d   8 byte real
'f', (float),         // f   4 byte real
'k', (IUnknown*),     // k   IUnknown*
'h', (long),          // h   HANDLE
'l', (long),          // l   long
'p', (void*),         // p   pointer
's', (BSTR),          // s   string
't', (short),         // t   short
'u', (UINT),          // u   unsigned int
'w', (BSTR),          // w   wide string

Código: [Seleccionar]
Constantes o flags para "f="
'm' = Microsoft compatible (exclusive con b)
'b' = Borland compatible (exclusive con m)
's' = Standart call _stdcall (exclusive con c)
'c' = C Call _cdecl(exclusive con s)
'4' = 4 byte real value returned in ST (exclusive con 8)
'8' = 8 byte real value returned in ST (exclusive con 4)


Espero que se haya entendido.
Aquí estaría el código completo trasladado a VBS.
Código: [Seleccionar]
Dim oDW
Set oDW = CreateObject("DynamicWrapper") ' Instantiate dynawrap
oDW.Register "user32.dll", "SetWindowPos", "i=lllllll", "f=s", "r=l"
oDW.Register "user32.dll", "FindWindowA", "i=ss", "f=s", "r=l"

Const SWP_HIDEWINDOW = &H80
Const SWP_SHOWWINDOW = &H40

Sub HideTaskbar()
Dim Thwnd
Thwnd = oDW.FindWindowA("Shell_traywnd", "")
Call oDW.SetWindowPos(Thwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW)
End Sub

Sub ShowTaskbar()
Dim Thwnd
Thwnd = oDW.FindWindowA("Shell_traywnd", "")
Call oDW.SetWindowPos(Thwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW)
End Sub




« Última modificación: 10 de Agosto de 2012, 11:14:11 por IAO »
"No hay caminos para lograr la PAZ. La PAZ es el camino"... (Mahatma Gandhi).
Mentes Superiores discuten Ideas, Proyectos. Mentes Promedio discuten Acontecimientos y Sucesos. Mentes Pobres discuten sobre Personas.

Desconectado IAO

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 702
Re: Resumen de dynawrap.dll
« Respuesta #1 en: 10 de Agosto de 2012, 10:44:00 »
Esta es la parte que corresponde a la  publicación realmente.
Deberías leer el referenz.txt está en alemán, me tocó traducir para entender cosas.

PORT.DLL
=========
Lo obtienes en:
El Port.zip

El archivo referencia de programacion esta aquí:
La referenz aleman

Ejemplos en VB para el port.dll
El start5.zip


Me faltó todas las funciones que exporta el PORT.DLL lo deje en casa

Esta librería utiliza todas sus funciones en mayúsculas. Que quede claro esto.
Okey.

Conseguí un ejemplo en VB con PORT.DLL y me parece que es para win95/98.
Código: [Seleccionar]
Declare Sub OPENCOM Lib "Port.dll" (ByVal A$)
Declare Function OPENCOM Lib "Port.dll" (ByVal A$) As Integer
Declare Sub CLOSECOM Lib "Port.dll" ()
Declare Function READBYTE Lib "Port.dll" () As Integer

Sub Main
Dim strByte as string
Dim strE as string
Dim oForm As object

Call OPENCOM ("COM5:4800,N,8,1")
   strByte = READBYTE()

   Do While strByte = -1 '''wait until valid data comes
   strByte = READBYTE()
   Loop
  
   strByte=Chr$(strByte)
   strE = READBYTE()
  
  Do While strE <> 10 '''get data until end of line.
                      '''This is an ASCII code number (BYTE)
 '''so change for your own end of data line.
Rem It assumes that there will be no errors on READBYTE, so if you want to
Rem detect for (-1), you should do it here.
   strByte = strByte & chr$(strE)
   strE = READBYTE()
   Loop
  
   CALL CLOSECOM() '''MUST CLOSE when completed loop
End Sub


Pero la idea era hacerlo en JavaScript, pero decidí hacerlo en VBS para publicarlo aquí.
Lo primero. Como lo aprendí, fue pasar esos "Declare Function" que me volvieron loco.

Declare Sub OPENCOM Lib "Port.dll" (ByVal A$)
Declare Function OPENCOM Lib "Port.dll" (ByVal A$) As Integer
Declare Sub CLOSECOM Lib "Port.dll" ()
Declare Function READBYTE Lib "Port.dll" () As Integer

El primero que hice fue el "CLOSECOM" que no tiene argumentos y no retorna un valor.
oDW.Register "Port.dll", "CLOSECOM", "f=s"
Fíjate que llamo la librería, luego la Función en mayúscula, sin argumentos, sin valor de retorno.

El segundo fue "READBYTE" no tiene argumentos pero retorna un valor
oDW.Register "Port.dll", "READBYTE", "f=s", "r=l"
Aquí por algunas lecturas que hice decidí poner el valor de retorno a long "r=l"
pero podría ser "r=t" (t=short 2 bytes) no encontre valor retorno Integer.

El tercero "OPENCOM" fue el que más dolor de cabeza me dió hasta que traduje el referenz.txt.
el (ByVal A$) me tenía confundido y luego supe que era un String. Y el "As Integer" como expliqué
decidí colocarlo como tipo long. La cosa es que casi todas las librerias hechas en C/C++ los programadores
tienden hacer el retorno tipo long. Eso fue lo que lei y por eso lo deje así.

Aquí esta el código completo y me funcionó conectando con HyperTewrminal.

Código: [Seleccionar]
'''Lo más facil:
'''*Instanciar DynaWrap...
Dim oDW
Set oDW = CreateObject("DynamicWrapper")

'''Lo más complicado.
'''Llamar la librería, con sus funciones y poner los argumentos.
oDW.Register "Port.dll", "OPENCOM",  "i=s", "f=s", "r=l"
oDW.Register "Port.dll", "CLOSECOM", "f=s"
oDW.Register "Port.dll", "READBYTE", "f=s", "r=l"
oDW.Register "Port.dll", "SENDBYTE", "i=l", "f=s"


Dim strByte, strE, oForm

   oDW.OPENCOM "COM3: baud=9600 data=8 parity=N stop=1"  '''("COM5:4800,N,8,1")
  
   strByte = oDW.READBYTE()
   Do While strByte = -1   '''wait until valid data comes
   strByte = oDW.READBYTE()
    Loop
   '''Aqui no se usa Chr$, solo Chr
   strByte = Chr(strByte)
    WScript.Echo "Escribio  " & strByte
    strByte = ""
  
   oDW.CLOSECOM() '''MUST CLOSE when completed loop
                  '''Muuuuy importante debe cerrar el puerto. IMPORTANTE!!!.


Set oDW = nothing '''clean up
WScript.Echo "Ready"
WScript.Quit


Para finalizar les dejo un ejemplo para puerto paralelo con Inpout32.dll y dynawrap.dll esta funcionando.
Es de otro alemán. Lo traduje más o menos mal :)
sin explicaciones....

Código: [Seleccionar]
' Programa para encender la luz a través del puerto paralelo
'   => poner un pin en el puerto paralelo durante un tiempo determinado
' programado por Daniel Kelber de Miguel   08/2005
'
' Anmerkungen:
' - Este programa requiere inpout32.dll para cambiar los pasadores de Anda
'registrada dynwrap.dll para llamar a los inpout32.dll
' - derechos inpout32.dll administrador se requieren para la conmutación de los pasadores
'   y por lo tanto se llama este script en el contexto de administrador!

Option Explicit
Dim inpoutDll
Dim parallelPortAdr
Dim bitToSwitch
Dim bitSetTime
Dim verboseMode

' a ver un poco de lo que sucede aquí es el modo detallado está armado.
' VerboseMode = 1 hace que una pantalla de toda la información pertinente; VerboseMode = 0
' elimina la producción
verboseMode = 1

' Por favor, introduzca la ruta donde el inpout32.dll instalados:
'inpoutDll = "C:\inpout\inpout32.dll"
inpoutDll = "C:\windows\system32\inpout32.dll"
If verboseMode Then wscript.echo "Ruta: " & inpoutDll

' Aquí indicará la dirección del puerto paralelo como un decimal
' (véase también la configuración del BIOS):
parallelPortAdr = 888

' Por favor, introduzca este bit (0-7) para especificar que desea cambiar:
bitToSwitch = 0

' Por favor introduzca la duración en milisegundos el tiempo que el poco que se establezcan:
bitSetTime = 200



'-----------------------------------------------------------------------------------
'                    aquí vamos!
'-----------------------------------------------------------------------------------

Dim pptActualValue
Dim pptNewValue

' la UserWrap tenemos que ser capaces de responder a las inpout32.dll:
Dim UserWrap
Set UserWrap = CreateObject("DynamicWrapper")

' acerca de la UserWrap objeto de nuestra actual relación con las funciones de la dll atrás:
UserWrap.Register "" & inpoutDll, "Out32", "I=tt", "f=s", "R=k"
UserWrap.Register "" & inpoutDll, "Inp32", "I=t" , "f=s", "R=t"

' Ahora podemos llamar a las funciones. En primer lugar vamos a ver cuáles son los niveles en el puerto:
pptActualValue = UserWrap.Inp32(parallelPortAdr)

' Ahora ponemos el bit deseado:
pptNewValue = (pptActualValue or (2^bitToSwitch))
UserWrap.Out32 parallelPortAdr, pptNewValue

' El poco ahora debe mantenerse durante un cierto tiempo (-> Espera):
wscript.sleep bitSetTime

' a continuación ponemos la broca:
UserWrap.Out32 parallelPortAdr, (pptNewValue-(2^bitToSwitch))

If verboseMode Then
wscript.echo "Acceso al puerto paralelo"        & vbCRLF &_
            "Puerto: "                         & parallelPortAdr    & vbCRLF &_
            "bits para ser conmutadas:"        & bitToSwitch        & vbCRLF &_
            "El tiempo"                        & bitSetTime & " ms" & vbCRLF &_
            "DLL de ruta:"                     & inpoutDll          & vbCRLF &_
            "Valor del puerto paralelo al principio: "  & pptActualValue     & vbCRLF &_
            "Puerto paralelo conjunto de valores: "     & pptNewValue        & vbCRLF &_
            "Valor del puerto paralelo al final: "      & (pptNewValue-(2^bitToSwitch))
End If

' et voila, c'est fini...!


Me parece que es todo, si hay un error me disculpan...

Felices dias para todos....
« Última modificación: 10 de Agosto de 2012, 11:09:24 por IAO »
"No hay caminos para lograr la PAZ. La PAZ es el camino"... (Mahatma Gandhi).
Mentes Superiores discuten Ideas, Proyectos. Mentes Promedio discuten Acontecimientos y Sucesos. Mentes Pobres discuten sobre Personas.