" Serpiente marina" exclamó alguien.
Vi una larga serpiente marina negra nadando en las profundidades del mar y casi todos estaban aturdidos. Pero la serpiente marina dijo algo que nos asustó: "Soy la famosa cuerda VB. Si continúas buceando, tienes que intentar pasarme".
Lo observo habitualmente, porque sé que para derrotar a un oponente, debes comprenderlo profundamente.
Entonces escribí un pequeño CÓDIGO para entenderlo.
Este código funciona muy bien, exactamente como lo imaginé, y muestra 12, 24,
Bien, entonces voy a usar TextOut para imprimirlo en la ventana. En cuanto a por qué debo usar esta función y no otras, ¿te importa? Entonces escribí el siguiente código
¿Encontré algo mal? Parece que la longitud de la cadena es incorrecta. Entonces lo pienso. En VB, la cadena es de tipo BSTR, por lo que se debe usar L2 como longitud. Lo sabrás después de probarlo.
Dios mío, el Libro del Cielo aparece después de la cuerda. ¿Es Dios insinuándome cuándo darme una mujer hermosa?
Pero creo que Dios no me responderá tan pronto, así que debe haber algún problema con mi código.
Mientras meditaba, todos me miraban. De ninguna manera, es tan guapo.
Entonces escribí rápidamente el siguiente código.
Cuando presioné rápidamente F5, hubo un eco en el cielo y la frase "Dame una belleza" obtuvo la respuesta correcta.
En ese momento, miré esta serpiente marina y nadé hacia ella con confianza, pero sonrió misteriosamente.
¿Alguna vez has visto la sonrisa de una serpiente? Nadaba lentamente.
"Sería demasiado fácil para ti pasarme de largo así." ¿Por qué esta frase te resulta tan familiar? ¿Alguien del Zodíaco Dorado dijo esto?
"Te hago una pequeña prueba, ¿conoces la diferencia entre vbNullString y "" ?"
"No creas que eres una gran persona porque eres una serpiente marina. Tu pregunta es demasiado simple". Un joven a mi lado que no es feo y recibe el sobrenombre de " El séptimo hombre guapo del mundo " dijo: " ¿Crees que no he leído la Guía de vida marina? "Sí (Explorador de objetos)
ConstvbNullString=""
Miembros de VBA.Constants
Constante utilizada al llamar a un procedimiento externo que requiere una cadena de valor distinto de cero
"Entonces quieres decir que son iguales, pero ¿qué pasa con vbNullChar?" La serpiente marina miró al séptimo hombre guapo del mundo con malas intenciones.
"Por supuesto que es lo mismo. ¿Leíste las instrucciones de VB?", Soltó el séptimo hombre guapo del mundo, pero sintió que algo andaba mal. Pero el navegador de objetos de VB dice
Miembros de VBA.Constants
Entonces, ¿qué representa el siguiente código?
Sea Serpent da su código
Después de que el séptimo hombre guapo del mundo presionó F5, se sorprendió con los resultados del código Sea Snake.
018992841434596
020
Eso significa que alguien debe estar equivocado entre las instrucciones de VB y Sea Snake. Además, para S1, ambos valores son cero, el puntero apunta a cero y la longitud es cero. No es un valor cero en el sentido ordinario.
El séptimo hombre guapo del mundo giró la cabeza y me miró.
"Chico, presume. Vamos, déjame mostrarte algo primero".
"Si quieres derrotar a la serpiente marina, debes comprender la estructura de la serpiente marina".
La cadena de VB es una cadena BSTR estándar. Por ejemplo, la estructura de la cadena "Hola" es la siguiente.
->-ancho="26">0
->-ancho="37">0
->-ancho="40">'H
->-ancho="35">0
->-width="48">'e'
->-ancho="44">0
->-ancho="42">'l'
->-ancho="40">0
->-ancho="40">'l'
->-ancho="39">0
->-ancho="38">'o'
->-ancho="35">0
->-ancho="35">0
->-ancho="38">0->
Puede ver que los primeros cuatro bytes representan el número de bytes ocupados por la longitud real de la cadena, que es un valor Largo.
Y los dos últimos bytes son los caracteres finales que representan el valor cero.
Los diez bytes del medio son exactamente el contenido de la cadena.
Si usamos s1="Hola", ¿adónde apunta s1?
"Al principio pensé que s1 apuntaba al primer byte, pero cuando utilicé mi herramienta de observación de memoria VB autoescrita para observar el valor del byte después de strptr(s1) , descubrí que s1 apuntaba al quinto byte, que es ahí donde nuestro La cuerda realmente comienza”.
"Todo el mundo conoce la estructura de la serpiente marina, entonces, ¿por qué las tres situaciones que acaba de proponer son diferentes?", Le pregunté al buzo que todavía estaba aturdido.
"Sí, ¿por qué?"
Bien, saca tu OleView y abre VB6.DLL en Archivo->ViewTypeLib. ¿Has visto un mundo maravilloso? No te quedes aturdido y encuentra las siguientes partes.
Ábrelos y verás las definiciones reales dentro de VB.
¿Viste que vbNullString apunta a una cadena vacía, pero esta cadena vacía tiene una dirección cero ? Y vbNullChar es un carácter cero (equivalente al último carácter de una cadena en C). Entonces, echemos un vistazo a lo que sucede cuando se ejecuta el código Sea Snake.
Cuando VB vio esta oración, claramente cambió el valor de S1 a cero.
Cuando VB vio esta oración, tomó varias acciones. Usó SysAllocStringLen para asignar una cadena BSTR en el montón y luego copió '/0' en esta cadena.
VB ha trabajado mucho aquí. En primer lugar, VB trata "" como una constante al compilar y debe asignar una variable internamente para esta cadena vacía. Cuando se carga el archivo EXE, también se debe establecer una dirección, aunque no significa nada.
es una cadena como 000000000000, que requiere 6 bytes (cuatro bytes de encabezado y 2 bytes de cola)
Luego, cuando vea esta oración, pase el valor de la dirección del quinto byte a s3
Por lo tanto, aunque acaba de escribir un "" a mano, VB terminó trabajando mucho más. Aunque 6 bytes no es mucho, en un proyecto grande donde todos escriben "" en todas partes, también supone un gasto considerable. Así que la próxima vez no debes usar "" , pero asegúrate de usar vbNullString
"Eso dijiste, serpiente marina", la miré con desdén.
Al ver que todos se dieron cuenta de repente, la serpiente marina se rió de nuevo (¿pueden reírse las serpientes marinas?)
"Comprenderme no significa controlarme realmente. Muchos buzos C desdeñarán a VB. ¿Sabes por qué?"
"Lento, el funcionamiento de las cuerdas de VB es demasiado lento." Muchos buzos se apresuraron a responder a esta pregunta.
"Jaja, sí", la serpiente marina se rió a carcajadas y nadó lentamente hacia las profundidades del mar " ¡Volveré! "
Nos quedamos con un grupo de buceadores y todos piensan: ¿realmente entendemos a la serpiente marina? Porque la serpiente marina en VB Ocean Legend da bastante miedo, ¿se alejará tan fácilmente? ¿Qué significa IwillBack? ?
Pero seguiremos buceando….
"¡Mira, el arrecife de coral!", exclamó alguien. ->