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í.
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)
'''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
' 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.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.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"
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
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.
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