.
Me ire un poco a algo mas interno en vb6, esperando no confundir a nadie... para que comprendan un poco mas la estructra de las variables en VB6 y por ende comprener algunos aspecto y entender unos trucos avanzados con respecto a velocidad en vb6.
Definicion Basica Fundamental.
Puntero o Apuntador: Es una variable que contiene la dirrecion de otra variable.
Guiandome en esta DEFINICION que es irrefutable puedo AFIRMAR y SUSTENTAR LO SIGUIENTE.Cuando declaras una variable tipo String, Array del tipo que sea y ademas
NO TIENE UNA LONGITUD FIJA, se pueden y
deben considerarse como APUNTADORES,
en vb6 NO HAY PUNTEROS DE MANEJO LIBRE es decir que no podemos declarar y modificar a gusto los punteros de manera deliberada como en C/C++
PERO SE PUEDEN SIMULAR asiendo algunas cosillas, aun asi no le quitara el hecho de que es
CUTRE pero FUNCIONAL y es mas
puede acercarse un poco a la velocidad de C/C++ pero no la igualara ni superara en ningun momento.En el caso de C/C++ con respecto a los APUNTADORES que solo le pones el "*" y obtienes el contenido de donde apunte, en VB6 DEBES usar
RtlMoveMemory para SIMULAR LA RUTINA DE C/C++ (*) respecto a un APUNTADOR.
En C seria... algo asi no llendo a mas lios...
char a[] = "BlackZeroX";
char* pa = a; // Se guarda el puntero de la variable "a" en "pa".
En VB6 se hace asi para SIMULAR lo anterior para saltarnos la restriccion que nos pone vb6.
Dim a as string
Dim b as string
a = "BlackZeroX"
RtlMoveMemory VarPtr(b), VarPtr(a), &H4 ' // Lo mismo que lo anterior en C/C++...
' // Antes de terminar el proceso donde se Autodestruyen ambas variables hay que hacer esto:
RtlMoveMemory VarPtr(b), &H0 &H4 ' // esta seria otra desventaja ya que SI NO SE HACE PROVOCA A LA LARGA UN CRASH.
' // Nota: si "b" apuntaba a un contenido o ya se le habia asignado un contenido X debera de guardarse la _
dirrecion ala que apuntaba en una variable tipo long, y al final antes de su autodestruccion debera de volver _
a tener el mismo puntero, ya que de lo contrario se crearia un Extraordinario Memory leak (Fuga de memoria) _
y al final un Crash...
Caso omiso cuando se declara.
Dim a as string * 20
La variable "a" no apunta a ningun lugar, ya que su memoria ya esta asignada y es CONSTANTE (Su longitud)
En resumen en C/C++ para obtener la longitud de una cadena en VB6 debes hacer esto:
lLn = ((int*)(pSringVB6 - 0x4))
// pSringVB6 es el puntero a la variable string de vb6 obtenida con StrPtr
if (lLn) lLn >>= 1;
/*
Dividimos entre 2 de manera binaria SOLO si se paso con StrPtr() el puntero
de la string de lo contrario No debera ser dividido entre 2 ya que vb6 transforma
una variable String en formato Ansi... es decir quita los Bytes Nulos que sirven
como separadores en el formato Unicode de vb6 aun que no se ocupen para eso.
*/
Ejemplo y codigo en C (dll) + vb6
<click aquí>, Recomendacion Comilador Codeblocks.
En vb6 SIN USAR LEN, LENB, Apis o similares...
Public Function altLen(ByRef sStr As String) As Long
Dim lRet As Long
' // Simulacion de StrPtr()
RtlMoveMemory VarPtr(lRet), VarPtr(sStr), &H4 ' // Leemos el apuntardor a la cadena.
If (lRet = &H0) Then Exit Function ' // Si el puntero es &H0 es que no hay ninguna cadena.
RtlMoveMemory VarPtr(lRet), ByVal (lRet - &H4), &H4 ' // Leemos la longitud en Bytes SOLO de la cadena en UNICODE.
altLen = (lRet \ 2) ' // Por ser UNICODE dividimos entre 2
End Function
Public Function altLen2(ByRef sStr As String) As Long
Dim lRet As Long
lRet = StrPtr(sStr)
If (lRet = &H0) Then Exit Function ' // Si el puntero es &H0 es que no hay ninguna cadena.
RtlMoveMemory VarPtr(lRet), ByVal (lRet - &H4), &H4 ' // Leemos la longitud en Bytes SOLO de la cadena en UNICODE.
altLen2 = (lRet \ 2) ' // Por ser UNICODE dividimos entre 2
End Function
Nota: Duando se declara una variable tipo Array sea cual sea en lugar de apuntar a su primer indice, realmente apunta a su Estructura SafeArray y en esta su miembro pvData apunta a su primer elemento... cabe destacar que si es un array String quiere decir que su elemento al que apunta pvData seran apuntadores ya que no tienen una longitud Definida.
Temibles Lunas!¡.