Hay varias declaraciones de apariencia similar en VB6: Let, Set, LSet y RSet.
Let se utiliza para la asignación de variables generales:
Copie el código de código de la siguiente manera:
[Let] varname = expresión
En la mayoría de los casos, omitimos Let y asignamos valores directamente con el signo igual, por lo que muchas personas ni siquiera conocen la existencia de Let.
Set se utiliza para la asignación de objetos, apuntando la variable al objeto y aumentando el recuento de referencias del objeto. Mucha gente no sabe qué es el recuento de referencias.
Entonces, ¿para qué se utiliza LSet? A primera vista parece una combinación de Let y Set, pero no lo es. La L en LSet es la abreviatura de Left y su contraparte es RLet. ¿Me preguntas cómo sé que L es la abreviatura de Izquierda? Lo que dice el documento:
Copie el código de código de la siguiente manera:
Declaración LSet
A la izquierda alinea una cadena dentro de una variable de cadena o copia una variable de un tipo definido por el usuario en otra variable de un tipo diferente definido por el usuario.
Declaración RSet
A la derecha alinea una cadena dentro de una variable de cadena.
LSet tiene una función más que RSet. No veamos esto primero. Veamos primero la misma parte. Ambos se usan para alinear una cadena a la izquierda (derecha) en una variable de cadena. ¿Qué significa? De hecho, no lo entiendo con solo leer la documentación. Probémoslo en la práctica:
Copie el código de código de la siguiente manera:
Subprincipal()
URL tenue como cadena
Atenuar como cuerda
Let url = "//www.VeVB.COm"
s = Cadena$(20, "*")
LEstablecer s = URL
Depurar.Imprimir s
REstablecer s = URL
Depurar.Imprimir s
Subtítulo final
Salida (tenga en cuenta los espacios):
Copie el código de código de la siguiente manera:
//www.VeVB.COm
//www.VeVB.COm
De hecho, está alineado a la izquierda y a la derecha, y nuestro asterisco * se reemplaza por un espacio. ¿De qué sirve esto? En mi opinión, parece que puede resultar realmente inútil. No sé qué pensó el diseñador.
Sin embargo, otra función de LSet es muy poderosa. Puede copiar una variable de tipo definida por el usuario a otra variable de tipo definida por el usuario. ¿Qué quiere decir esto?
Déjame darte un ejemplo. ¿Conoces la dirección IP? La IP devuelta al hacer ping a Baidu aquí es 61.135.169.125. La dirección IP en este formato es solo para visualización humana. La IP en realidad está representada por un número entero de 32 bits dentro de la computadora. ¿Cómo utilizar VB para convertir la dirección IP en formato xxx.xxx.xxx.xxx a un entero de 32 bits? Después de algo de Google, puedes escribir un código similar a este:
Copie el código de código de la siguiente manera:
Subprincipal()
Depurar.Imprimir IPToLong("61.135.169.125")
Subtítulo final
Función privada IPToLong (IPStr como cadena) siempre y cuando
Dim Str() como cadena, HEXStr como cadena, TempStr como cadena
Oscuro x Mientras Largo
Cadena = Dividir(IPStr, ".")
CadenaHEX = ""
Para x = 0 a UBound(Str)
TempStr = Hexadecimal(Str(x))
HEXStr = HEXStr y Cadena(2 - Len(TempStr), "0") y TempStr
Siguiente x
IPToLong = CLng("&H" & HEXStr)
Función final
El código funciona bien, no tiene nada de malo, pero podemos escribir código más "avanzado" usando la declaración LSet:
Copie el código de código de la siguiente manera:
Tipo privado myBytes
B1 como byte
B2 como byte
B3 como byte
B4 como byte
Tipo de extremo
Tipo privado myLong
Val mientras tanto
Tipo de extremo
'Por demonio
'http://VeVB.COm
Función pública IP2Long (ip como cadena) Mientras sea larga
Atenuar a() como cadena
Dim b como myBytes
Dim l como mi largo
a = Dividir(ip, ".")
'Nota Little-Endian
b.B1 = CByte(a(3))
b.B2 = CByte(a(2))
b.B3 = CByte(a(1))
b.B4 = CByte(a(0))
LEstablecer l = b
IP2Largo = l.Val
Función final
Utilice LSet para copiar una variable de tipo myBytes a una variable de tipo myLong. Es muy bueno y potente. Eche un vistazo al código ensamblador generado:
Copie el código de código de la siguiente manera:
00401A0E lea eax, dword ptr [ebp-0x20];
00401A11 empujar eax
00401A12 lea eax, dword ptr [ebp-0x14];
00401A15 empujar eax
00401A16 empujar 0x4
00401A18 llame a __vbaCopyBytes; jmp a MSVBVM60.__vbaCopyBytes
Lo que se llama es __vbaCopyBytes en MSVBVM60.DLL. El primer parámetro es el byte que se va a copiar, el segundo parámetro es la dirección de destino y el tercer parámetro es la dirección de origen. Es similar a la función memcpy en la biblioteca estándar de C. excepto que El orden de los parámetros es diferente y su implementación interna no es más que instrucciones de transferencia de cadenas en ensamblador:
Copie el código de código de la siguiente manera:
72A1A0F3 > mov ecx, dword ptr [esp+0x4]
72A1A0F7 empujar esi
72A1A0F8 mov esi, dword ptr [esp+0x10]
72A1A0FC empujar edición
72A1A0FD mov edi, dword ptr [esp+0x10]
72A1A101 movimiento eax,ecx
72A1A103 movimiento edx, edi
72A1A105 shrecx, 0x2
72A1A108 rep movs dword ptr es:[edi], dword ptr [esi]
72A1A10A mov ecx, eax
72A1A10C movimiento eax, edx
72A1A10E y ecx, 0x3
72A1A111 rep mueve byte ptr es:[edi], byte ptr [esi]
72A1A113 popedi
72A1A114 pop esi
72A1A115 retorno 0xC
Cabe destacar que la documentación nos advierte:
Copie el código de código de la siguiente manera:
Advertencia No se recomienda utilizar LSet para copiar una variable de un tipo definido por el usuario en una variable de un tipo diferente definido por el usuario. Copiar datos de un tipo de datos en un espacio reservado para un tipo de datos diferente puede provocar resultados impredecibles.
Cuando copia una variable de un tipo definido por el usuario a otro, los datos binarios de una variable se copian en el espacio de memoria de la otra, sin tener en cuenta los tipos de datos especificados para los elementos.
No se recomienda usar LSet para copiar variables de tipo definido por el usuario y puede generar resultados inesperados (como estructuras desalineadas), así que no use la instrucción LSet a menos que sepa lo que está haciendo.