[Source] CallByNameEx y argumentos aleatorios

Iniciado por BlackZeroX, 27 Marzo 2010, 01:47 AM

0 Miembros y 3 Visitantes están viendo este tema.

BlackZeroX


Este codigo que les dejo me arreglo una duda que tenia la cual me la respondio Google a una liga interesante ( Almenos para mi xP )

intentaba hacer algo similar a esto:

Código (Vb) [Seleccionar]


Private Sub Form_Load()
Dim Args()          As Variant
    ReDim Args(0 To 1)
    Args(0) = "hola Mundo"
    Args(1) = "12"
    CallByName Me, "Mensaje", VbMethod, Args()
End Sub

Public Sub mensaje(mensaje As String, Optional hola As Long)
    MsgBox mensaje, vbOKOnly, hola
End Sub



pero no daba y google me respodio:

http://www.devx.com/tips/Tip/15422

Código (vb) [Seleccionar]


' Required for use in VB5!
Public Enum VbCallType
VbMethod = 1
VbGet = 2
VbLet = 4
VbSet = 8
End Enum

Public Function CallByNameEx(Obj As Object, _
ProcName As String, CallType As VbCallType, _
Optional vArgsArray As Variant)
Dim oTLI As Object
Dim ProcID As Long
Dim numArgs As Long
Dim i As Long
Dim v()

On Error GoTo Handler

Set oTLI = CreateObject("TLI.TLIApplication")
ProcID = oTLI.InvokeID(Obj, ProcName)

If IsMissing(vArgsArray) Then
CallByNameEx = oTLI.InvokeHook( _
Obj, ProcID, CallType)
End If

If IsArray(vArgsArray) Then
numArgs = UBound(vArgsArray)
ReDim v(numArgs)
For i = 0 To numArgs
v(i) = vArgsArray(numArgs - i)
Next i
CallByNameEx = oTLI.InvokeHookArray( _
Obj, ProcID, CallType, v)
End If
Exit Function

Handler:
Debug.Print Err.Number, Err.Description
End Function



con lo cual ahora el CallByName bueno mejor dicho CallByNameEx acepta ahora expresiones de este tipo:

Código (vb) [Seleccionar]


Call CallByNameEx(Me, "xx", VbMethod, x)
Call CallByNameEx(Me, "xx", VbMethod, Array(1, 2)) 
Result=CallByNameEx(Me, "xx", VbMethod, x)



siendo que antes array() o pasandole un vector a CallByName No servia

Código (Vb) [Seleccionar]


Private Sub Form_Load()
Dim Args()          As Variant
    ReDim Args(0 To 1)
    Args(0) = "hola Mundo"
    Args(1) = "12"
    CallByNameEx Me, "Mensaje", VbMethod, Args()
End Sub

Public Sub mensaje(mensaje As String, Optional hola As Long)
    MsgBox mensaje, vbOKOnly, hola
End Sub



Sangrienta Luna Infernal!¡.
The Dark Shadow is my passion.

LeandroA

Interesante che, que aplicación sera TLI? saves cual es la refencia¿?

Saludos.

BlackZeroX

TypeLib Information

TLBInf32.dll

Sangriento Infierno Lunar.
The Dark Shadow is my passion.

BlackZeroX


Agregando la referencia... TypeLib Information:

Código (vb) [Seleccionar]


' Required for use in VB5!
Public Enum VbCallType
    VbMethod = 1
    VbGet = 2
    VbLet = 4
    VbSet = 8
End Enum
Public Function CallByNameEx(Obj As Object, ProcName As String, CallType As VbCallType, Optional vArgsArray As Variant)
On Error GoTo Handler
Dim oTLI            As TLIApplication '    //  Set oTLI = CreateObject("TLI.TLIApplication")
Dim ProcID          As Long
Dim numArgs         As Long
Dim i               As Long
Dim v()             As Variant
   
    Set oTLI = New TLIApplication
    If Not oTLI Is Nothing Then
        ProcID = oTLI.InvokeID(Obj, ProcName)
        If IsMissing(vArgsArray) Then
            CallByNameEx = oTLI.InvokeHook(Obj, ProcID, CallType)
        End If
        If IsArray(vArgsArray) Then
            numArgs = UBound(vArgsArray)
            ReDim v(numArgs)
            For i = 0 To numArgs
                v(i) = vArgsArray(numArgs - i)
            Next i
            CallByNameEx = oTLI.InvokeHookArray(Obj, ProcID, CallType, v)
        End If
    End If
Exit Function

Handler:
    Debug.Print Err.Number, Err.Description
End Function



Sangriento Infierno Lunar!¡.
The Dark Shadow is my passion.

Karcrack

Tambien podrias hacer esto, no?
Código (vb) [Seleccionar]
Private Sub Form_Load()
    Dim vParams(1)  As Variant
   
    vParams(0) = "Hi ho"
    vParams(1) = 1500
    CallByName Me, "Mensaje", VbMethod, vParams()
End Sub

Public Sub Mensaje(ByRef vParams() As Variant)
    Call MsgBox(vParams(0), , vParams(1))
End Sub

seba123neo

Cita de: Karcrack en 27 Marzo 2010, 13:03 PM
Tambien podrias hacer esto, no?
Código (vb) [Seleccionar]
Private Sub Form_Load()
    Dim vParams(1)  As Variant
   
    vParams(0) = "Hi ho"
    vParams(1) = 1500
    CallByName Me, "Mensaje", VbMethod, vParams()
End Sub

Public Sub Mensaje(ByRef vParams() As Variant)
    Call MsgBox(vParams(0), , vParams(1))
End Sub


si, yo tambien pense eso, pero el tema aca es que al pasarle el, array te pase cada indice del mismo al parametro correspondiente.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

BlackZeroX

Cita de: Karcrack en 27 Marzo 2010, 13:03 PM
Tambien podrias hacer esto, no?
Código (vb) [Seleccionar]
Private Sub Form_Load()
    Dim vParams(1)  As Variant
   
    vParams(0) = "Hi ho"
    vParams(1) = 1500
    CallByName Me, "Mensaje", VbMethod, vParams()
End Sub

Public Sub Mensaje(ByRef vParams() As Variant)
    Call MsgBox(vParams(0), , vParams(1))
End Sub


la cosa que si algun parametro es distinto a variant por ejemplo una revoltura de variados parametros de distintos tipos NO FUNCIONA y este era mi problema y no me hubiera gustado estar convirtiendo dentro cada parametro al real.
The Dark Shadow is my passion.

Karcrack

He estado investigando mas sobre TLI32 y es muy muy interesante... >:D

http://support.microsoft.com/kb/q224331/

:D

BlackZeroX

Cita de: Karcrack en 27 Marzo 2010, 18:24 PM
He estado investigando mas sobre TLI32 y es muy muy interesante... >:D

http://support.microsoft.com/kb/q224331/

:D

No dije yo esto pero...:

Puedes obtener las funciones/procesos/Propiedades y sus parametros con sus tipos respectivos...

Sangrienta Luna Infernal!¡.
The Dark Shadow is my passion.

LeandroA

che me gusto esa libreria mirando la ayuda vi que se pueden enumerar todas las constantes eventos funcion etc de una librerira

Private Sub Form_Load()

    Dim SIType As SearchItem
    Dim SIMember As SearchItem
    With TypeLibInfoFromFile("msvbvm60.dll")
      .SearchDefault = tliStConstants
      For Each SIType In .GetTypes
        For Each SIMember In .GetMembers(SIType.SearchData)
          Debug.Print SIMember, _
            .GetMemberInfo(SIType.SearchData, SIMember.InvokeKinds, SIMember.MemberId).Value
        Next
      Next
    End With

End Sub