desviar a VB hacia mi función

15/07/2003 - 03:11 por Javier Balkenende | Informe spam
Cuando VB tiene que ejecutar una función, por ejemplo InputBox, por la idea
que tengo entiendo que se fija en las referencias y sabe en que DLL está y
la dirección de entrada a esa DLL.
Yo lo que quisiera, es cambiar eso de manera que en lugar de que busque
allí, que busque en mi propia función, es decir, reemplazar la función de VB
¿Se podrá?
Sería algo así como "subclasificar la función".
Ahora, por si se les ocurre que no tiene sentido porque para eso llamo a mi
función y listo les comento que es para que esto ocurra al estar usando un
componente ActiveX, el cual sería el que haga este cambio de dirección.
A ver si los que tienen más idea que yo de estas cosas me comentan algo.
Saludos,

Javier

PD: la próxima vez trataré de necesitar algo más sencillo (no garantizo
nada)




Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.493 / Virus Database: 292 - Release Date: 25/06/2003

Preguntas similare

Leer las respuestas

#1 Leonardo Azpurua
15/07/2003 - 14:32 | Informe spam
"Eduardo A. Morcillo [MS MVP]" <emorcilloATmvps.org> escribió en el mensaje
news:
Este es un ejemplo de la sobreescritura de la funcion:
Public Sub ReplaceFunction( _
ByVal Dll As String, ByVal Func As String, ByVal Add As Long)



Sorprendente...

Salud!
Respuesta Responder a este mensaje
#2 Javier Balkenende
15/07/2003 - 14:54 | Informe spam
Bueno, me saco el sombrero.
No sé si esa es una expresión universal o solo será de sacá ("me saco el
sombrero"), pero expresa admiración.

Lo acabo de probar en Windows XP, 2000 y 98, y anda perfectamente tanto
compilado como en el IDE. Me faltaría probarlo en Windows 95 y NT pero
supongo que también andará, ya que como se trabaja con las DLLs de VB no
tendría que haber diferencia con la plataforma.

La otra que necesitaba era la MsgBox y también la implementé sin problemas.

¿De dónde sale rtcInputBox? Yo me fijo con un inspeccionador de archivos (el
cual también bajé de la web de Eduardo) y me salen las definiciones de las
funciones pero me aparecen como InputBox y MsgBox, no me da otra información
que me lleve a saber lo de rtcInputBox.

Decir gracias es poco, espero que con algunos aportes que pueda hacer de vez
en cuando al grupo al menos devuelva un poco de la ayuda que he recibido.

Saludos,

Javier



"Eduardo A. Morcillo [MS MVP]" <emorcilloATmvps.org> escribió en el mensaje
news:
Javier,

Que cosas pides!!!

Bueno, lo mejor creo que es no hacerlo. Como se trata de un activex lo


mejor
seria que pusieras las funciones en una clase GlobalMultiuse para que


puedan
ser llamadas sin necesidad de instanciar una clase. Y para resolver el
problema de reemplazar las funciones originales de VB solo debes crear una
funcion con igual nombre en un modulo .bas y llamar a la funcion de la DLL
(las funciones en el proyecto tienen precedencia sobre las de las
referencias). Por Ejemplo:

Sub MsgBox(Mensaje As String)

' MiMensaje esta definido en la DLL
MiMensaje Mensaje

End Sub

Ahora si realmente quieres ir por el otro camino (el de los errores de
proteccion general :-) ) puedes hacer dos cosas. La primera es reemplazar


la
entrada de la tabla de exportacion de funciones de la dll (en memoria


claro
esta) para que la tabla apunte a tu funcion. La otra es tomar la direccion
de la funcion y reemplazar sus primeras instrucciones por un salto a tu
funcion. La desventaja de este metodo es que no puedes llamar a la funcion
original ya que la sobreescribes, mientras que con el otro, si guardas la
direccion de la funcion antes de reemplazarla podras utilizarla a traves


de
ese apuntador.

Este es un ejemplo de la sobreescritura de la funcion:

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, ByVal Length As Long)

Private Declare Function GetProcAddress Lib "kernel32" ( _
ByVal hModule As Long, _
ByVal lpProcName As String) As Long

Private Declare Function LoadLibrary Lib "kernel32" _
Alias "LoadLibraryA" ( _
ByVal lpLibFileName As String) As Long

Private Declare Function FreeLibrary Lib "kernel32" ( _
ByVal hLibModule As Long) As Long

Private Const PAGE_EXECUTE_READWRITE& = &H40&

Private Declare Function VirtualProtect Lib "kernel32" ( _
ByVal lpAddress As Long, _
ByVal dwSize As Long, _
ByVal flNewProtect As Long, _
lpflOldProtect As Long) As Long

Public Sub ReplaceFunction( _
ByVal Dll As String, ByVal Func As String, ByVal Add As Long)
Dim hMod As Long
Dim lPtr As Long
Dim alNew(0 To 2) As Long

' Cargar la DLL
hMod = LoadLibrary(Dll)

' Obtener apuntador a la funcion
lPtr = GetProcAddress(hMod, Func)

' Creo mi bloque de instrucciones
alNew(0) = &HB8909090 ' nop/nop/mov eax,
alNew(1) = Add ' function address
alNew(2) = &H9090E0FF ' jmp eax/nop/nop

' Desprotejo el bloque de memoria. Por defecto
' la memoria usada por codigo esta protegida
' contra escritura.
VirtualProtect lPtr, 12, PAGE_EXECUTE_READWRITE, 0&

' Copio el bloque de instrucciones al comienzo
' de la funcion
CopyMemory ByVal lPtr, alNew(0), 12

' Libero la dll
FreeLibrary hMod

End Sub

' ESTA FUNCION DEBE ESTAR EN UN MODULO .BAS
Function MyInputBox( _
ByRef Prompt As Variant, _
ByRef Title As Variant, _
ByRef Default As Variant, _
ByRef x As Variant, _
ByRef y As Variant, _
ByRef HlpFile As Variant, _
ByRef Ctx As Variant) As String

' Hay que tener cuidado con los parametros.
' Un parametro de mas o de menos, o de
' del tipo equivocado puede ocasionar
' un GPF (y seguro que lo hace)

MsgBox "Esto no es un InputBox!!!"

MyInputBox = "Funciona!!!"

End Function

Para reemplazar la funcion:

ReplaceFunction "msvbvm60.dll", "rtcInputBox", AddressOf MyInputBox

Dentro del IDE se utiliza la DLL vba6.dll en lugar de msvbvm60.dll asi que
no notaras diferencia hasta que compiles y ejecutes el exe.

Eduardo A. Morcillo [MS MVP - VB]
http://www.mvps.org/emorcillo







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.493 / Virus Database: 292 - Release Date: 25/06/2003
Respuesta Responder a este mensaje
#3 José Trinidad [El Tiko]
15/07/2003 - 15:29 | Informe spam
Plas, Plas, Plas! :-) Excelente!

Att.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
José Trinidad García M. <El Tiko>
(Guía de buen uso del foro)
http://perso.wanadoo.es/rubenvigon/foro
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Respuesta Responder a este mensaje
#4 Softjaen
15/07/2003 - 15:52 | Informe spam
"Eduardo A. Morcillo [MS MVP]" escribió:

Este es un ejemplo de la sobreescritura de la funcion:



Con tu permiso, éste ejemplo pasa a formar parte de «Mis favoritos». :-)

¡Estupendo, Eduardo!

Un saludo.

Enrique Martínez
[MS MVP - VB]
Respuesta Responder a este mensaje
#5 Eduardo A. Morcillo [MS MVP]
15/07/2003 - 16:42 | Informe spam
¿De dónde sale rtcInputBox?



Es el nombre que tiene la funcion en la DLL. Utiliza Depends.exe para saber
el nombre con que ha sido exportada la funcion.

Eduardo A. Morcillo [MS MVP - VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida