Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales
Autor
|
Tema: [VB6] ¿Cómo uso mZombieInvoke? (Leído 1,418 veces)
|
STARZ
Desconectado
Mensajes: 19
|
Ejemplo cualquiera para practicar el uso de Kinvoke; codigo normal con la API declarada Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long private sub form_load() Call ShellExecute(0, "Open", App.Path & "\UPX.exe", App.Path & "\comprimeme.exe", vbNullString, 0) end sub Exactamento lo mismo pero sin la api declarada (NO ME FUNCIONA): Invoke "KERNEL32", "ShellExecuteA", 0, StrPtr("Open"), StrPtr(App.Path & "\UPX.exe"), strptr(App.Path & "\comprimeme.exe"), vbNullstring, 0 ¿Cuál es el procedimiento, los pasos que tengo que realizar para pasar de mi función con la API declarada a una con Kinvoke? Muchas Muchas gracias Edit: estoy usando el módulo que aquí se detalla: http://cobein.com/wp/?p=567
|
|
|
|
« Última modificación: 24 Enero 2012, 02:08 por STARZ »
|
En línea
|
|
|
|
RHL
Desconectado
Mensajes: 968
mental
|
pasas cadenas unicode a una api de formato ascii proba con las API ShellExecuteW o converti la cadena a ascii
|
|
|
|
|
En línea
|
|
|
|
Karcrack
Desconectado
Mensajes: 2.192
Se siente observado ¬¬'
|
Como dice RHL: ShellExecuteW
|
|
|
|
|
En línea
|
|
|
|
STARZ
Desconectado
Mensajes: 19
|
Ninguno me funciona. ¿Qué estoy haciendo mal? Call Invoke("KERNEL32", "ShellExecutExW", 0, StrPtr("Open"), StrPtr(App.Path & "\UPX.exe"), StrPtr(App.Path & "\comprimeme.exe"), vbNullString, 0) Call Invoke("KERNEL32", "ShellExecutExA", 0, StrPtr("Open"), StrPtr(App.Path & "\UPX.exe"), StrPtr(App.Path & "\comprimeme.exe"), vbNullString, 0) Call Invoke("KERNEL32", "ShellExecuteA", 0, StrPtr("Open"), StrPtr(App.Path & "\UPX.exe"), StrPtr(App.Path & "\comprimeme.exe"), vbNullString, 0) Call Invoke("KERNEL32", "ShellExecuteW", 0, StrPtr("Open"), StrPtr(App.Path & "\UPX.exe"), StrPtr(App.Path & "\comprimeme.exe"), vbNullString, 0) Call Invoke("KERNEL32", "ShellExecute", 0, StrPtr("Open"), StrPtr(App.Path & "\UPX.exe"), StrPtr(App.Path & "\comprimeme.exe"), vbNullString, 0)  Edit: no se si sirva pero lo estoy probando en WIN7 x86 SP1
|
|
|
|
« Última modificación: 24 Enero 2012, 04:53 por STARZ »
|
En línea
|
|
|
|
RHL
Desconectado
Mensajes: 968
mental
|
Hay otros dos errores, esa api que quieres usar no es exportada de kernel32 es de shell32 tambien debes de pasarle el puntero a vbnullstring en las cadenas siempre pasar los punteros
|
|
|
|
|
En línea
|
|
|
|
|
raul338
|
En lugar de usar vbNullString, usar 0 directamente
|
|
|
|
|
En línea
|
|
|
|
STARZ
Desconectado
Mensajes: 19
|
Invoke "USER32", "ShellExecuteW", 0, StrPtr("Open"), StrPtr(App.Path & "\UPX.exe"), StrPtr(App.Path & "\comprimeme.exe"), 0, 0
Tampoco funciona, pero no tira ningún error,supongo que eso significa que SellExecuteW le corresponde a USER32.dll
|
|
|
|
|
En línea
|
|
|
|
RHL
Desconectado
Mensajes: 968
mental
|
Pero es que es increíble, sos necio o que  si te referis a ShellExecute es exportada de shell32 porque yo no conozco ninguna que se exportada de ninguna libreria que se llame SellExecuteW
|
|
|
|
|
En línea
|
|
|
|
STARZ
Desconectado
Mensajes: 19
|
Perdón por el doble mensaje. En el comentario anterior probé con SHELL32 como me decís vos más arriba, cuando tipee a mano me confundí y tipee USER32.
Sigue sin funcionar con el vbnulltring cammbiado por 0
|
|
|
|
« Última modificación: 24 Enero 2012, 08:49 por STARZ »
|
En línea
|
|
|
|
RHL
Desconectado
Mensajes: 968
mental
|
ok... Aqui hay un ejemplo: Invoke "SHELL32", "ShellExecuteW", 0, 0, StrPtr("C:/windows/system32/calc.exe"), 0, 0, 0 y copia y pega todo el modulo de karcrack sino es porque algunas invocaciones de los parametros de los demas programas estan malas, proba con ese ejemplo que te deje y si funciona y todo es por los parametros que se le pasan a los otros programas me imagino que no hacen lo que esperas o no hacen nada API ANSI: Dim MYANSI() As Byte MYANSI = StrConv("C:/windows/system32/calc.exe", vbFromUnicode) Invoke "SHELL32", "ShellExecuteA", 0, 0, VarPtr(MYANSI(0)), 0, 0, 0
|
|
|
|
« Última modificación: 24 Enero 2012, 09:10 por RHL »
|
En línea
|
|
|
|
STARZ
Desconectado
Mensajes: 19
|
Si, el problema estaba en el UPX. El code que pusiste anda perfecto. Ya aprendí: probar con cal.exe notepad.exe Ultima pregunta: ¿cómo inferiste que esa API era de SHELL32 y no a KERNEL32?; si yo agarro otra api, ¿como me doy cuenta cual dll que pide? Invoke "SHELL32", "ShellExecuteW", 0, StrPtr("Open"), StrPtr(App.Path & "\programa.exe"), StrPtr("-c -d"), 0, 0 '-c y -d son atributos
Edit: acabo de ver tu edit, gracias por el ejemplo ansi, aunque no me gusta eso de andar convirtiendo a bytes.
|
|
|
|
« Última modificación: 24 Enero 2012, 09:14 por STARZ »
|
En línea
|
|
|
|
|
|
|
|
BlackZeroX (Astaroth)
Wiki
Desconectado
Mensajes: 2.832
I'Love...!¡.
|
. Revisa la MSDN para saber que el nombre de la libreria adecuando a tratar en la llamada.
* No te recomiendo usar strptr("algo"), ya que es una mala practica en todo sentido.
Dulces Lunas
|
|
|
|
|
En línea
|
|
|
|
Karcrack
Desconectado
Mensajes: 2.192
Se siente observado ¬¬'
|
@BlackZeroX: Lo dices por que la cadena se crea al vuelo para la llamada y puede que ese puntero más tarde no exista?
|
|
|
|
|
En línea
|
|
|
|
|
|