VB SendMessage hace que la memoria sea ilegible. 1. Para los tipos estándar de Win32, no existe ningún tipo de cadena. Win32API solo tiene los siguientes tipos de cadena (lenguaje C) LPSTR == char *LPCSTR == const char *LPWSTR == wchar_t *LPCWSTR =. = const wchar_t * Para VB, el tipo String es relativo al BSTR de VC en OLE, en lugar del tipo general Win32API. Mire la definición de SendMessage en la API. Utiliza lParam As Any, sin ByVal, es decir, se pasa a través de la dirección, que es la dirección de memoria de la variable Str (0). una función oculta, también puedes escribirla así: SendMessage Text1.hwnd, EM_GETLINE, 2, ByVal ValPtr(Str(0)) define una matriz de bytes en lugar de una cadena, porque en Win32Api, todas las cadenas son matrices de caracteres, y la El lenguaje C estándar no tiene un tipo de cadena. SendMessage Text1.hwnd, EM_GETLINE, 2, Str(0) significa enviar Text1.hwnd, EM_GETLINE, 2, Str(0). Significa enviar un mensaje EM_GETLINE a Texto1, leer la cadena en la línea 2 (la línea superior es la línea 0) y almacenar los datos en el espacio con la dirección Str(0). Por lo tanto, el tipo de cadena no se puede usar aquí y se debe usar una matriz de bytes. Si es NB, también puede escribir Dim s As StringS = Space(128)S(0) = Chr(&100H)SendMessage Text1.hwnd. EM_GETLINE, 2, ByVal StrPtr(S) No he hecho experimentos, pero en teoría puedes usar la función StrPtr 2. La definición del segundo parámetro de EM_GETLINE se encuentra en Win32API: lParam Un puntero a un búfer para recibir una copia de la línea. Establece la primera palabra de este búfer al tamaño del búfer en unidades TCHAR antes de enviar el mensaje. Para texto ANSI, este es el número de bytes; para texto Unicode, este es el número de caracteres. Para texto ANSI, este es el número de bytes; para texto Unicode, este es el número de caracteres. El tamaño de la primera palabra será sobrescrito por la línea copiada. El tamaño de la primera palabra será sobrescrito por la línea copiada. Es decir, Str (0) y Str (1) son los tamaños internos del búfer, porque Byte es un byte, Word son dos bytes, 0001 byte es &0100H después de revertirse en la memoria, que es 256, es decir, el buffer La capacidad máxima de caracteres del área es de 256 bytes. 3. De forma predeterminada, las partes de la matriz en realidad comienzan desde 0 y se define la longitud de la matriz, no la etiqueta de contexto. Por ejemplo, Str(256) es válido desde Str(0) hasta Str(255). Str(1) Ya respondió, dado que el valor del primer carácter es 256, se debe establecer Str(1)=1 en lugar de Str(0)=1. Esto se debe a que el procesador de arquitectura x86 utiliza el orden de bytes Little-Endian, con el byte alto al final y el byte bajo al principio. Esto se debe a que el procesador de arquitectura x86 utiliza el orden de bytes Little-Endian, con el byte alto al final y el byte bajo al principio. Esto debe discutirse intensivamente en "Principios de composición informática".
4. Si observa con atención, la definición de API usa SendMessageA en lugar de SendMessageW. Esto significa que la función definida usa codificación de caracteres ANSI en lugar de Unicode internamente, por lo que para este problema, las cadenas de caracteres finales devueltas son todas ANSI. esta matriz de cadenas, necesitamos usar StrConv para convertirla a Unicode. Por supuesto, también puede usar SendMessageW, para que finalmente pueda obtener la declaración Text2.Text = CStr (Str) para convertir directamente el valor a PS: If. Si desea comprender el contenido, aún necesita saber algo sobre Win32API. PD: si desea comprender el contenido, aún necesita saber algo sobre Win32API. Esto ya implica tecnología VB relativamente avanzada. comprensión de VC, creo que nuestra comprensión de este tema mejorará.