visual operador net length left instr string memory vb6

operador - substring visual basic



Fuera de String Space en Visual Basic 6 (6)

Estamos obteniendo un error en una aplicación VB6 que envía datos hacia adelante y hacia atrás sobre los sockets TCP. Obtenemos un error de tiempo de ejecución "fuera del espacio de cadena". ¿Alguien ha visto esto o tiene alguna idea sobre por qué esto sucedería? Parece que estamos alcanzando un límite de VB6, por lo que cualquier otro pensamiento sería útil también.

eso, ak



Texto encontrado en MSDN:

http://msdn.microsoft.com/en-us/library/aa264524(VS.60).aspx

Referencia de Visual Basic para Aplicaciones Fuera del espacio de cadena (Error 14)

Detalles específicos

Visual Basic le permite usar cadenas muy grandes. Sin embargo, los requisitos de otros programas y la forma en que manipula sus cadenas pueden causar este error. Este error tiene las siguientes causas y soluciones:

  • Las expresiones que requieren que se creen cadenas temporales para la evaluación pueden causar este error. Por ejemplo, el siguiente código provoca un error de espacio sin cadena en algunos sistemas operativos:

MyString = "Hello" For Count = 1 To 100 MyString = MyString & MyString Next Count

Assign the string to a variable of another name. * Your system may have run out of memory, which prevented a string from

siendo asignado.

Elimine cualquier aplicación innecesaria de la memoria para crear más espacio.

Para obtener información adicional, seleccione el elemento en cuestión y presione F1.


En algún momento de la primavera de 2009, Microsoft hizo una actualización de XP que interfiere con el envoltorio Armadillo / Silicon Realms. La línea de código que arrojaba el error 14, el espacio Fuera de cadena no era lógico. No hubo problema con una cadena de tamaño excesivo. Fue una asignación simple que incluso cambié para ser "foo" y todavía ocurrió el error 14. Creo que el error está mapeado incorrectamente en XP. La respuesta para nosotros fue eliminar copyMem-11 del proyecto de protección Armadillo y volver a envolver el exe.


Como han señalado otros, cada concatenación de cadenas en VB asignará una nueva cadena y luego copiará los datos y luego des-asignará el original una vez que pueda. En un ciclo esto puede causar problemas.

Para solucionar esto, puede crear una clase StringBuilder simple como esta:

Option Explicit Private data As String Private allocLen As Long Private currentPos As Long Public Function Text() As String Text = Left(data, currentPos) End Function Public Function Length() As Long Length = currentPos End Function Public Sub Add(s As String) Dim newLen As Long newLen = Len(s) If ((currentPos + newLen) > allocLen) Then data = data & Space((currentPos + newLen)) allocLen = Len(data) End If Mid(data, currentPos + 1, newLen) = s currentPos = currentPos + newLen End Sub Private Sub Class_Initialize() data = Space(10240) allocLen = Len(data) currentPos = 1 End Sub

Esta clase minimizará el número de asignaciones de cadenas al forzar la cadena que se construirá con espacios en ella y luego sobrescribirá los espacios según sea necesario. Se vuelve a asignar a aproximadamente el doble de su tamaño cuando descubre que no tiene suficiente espacio preinicializado. El método de texto devolverá la parte de la cadena que realmente se usa.


Agregando a la respuesta de Jacco, vbAccelerator tiene una gran clase de generador de cadenas que logra casi lo mismo pero es un poco más robusto. El autor también repasa la solución explicando cómo funciona.


Parece que estás añadiendo una cadena a menudo. Podría intentar usar una clase StringBuilder

Además, podría ser que tenga algunos objetos obsoletos que contienen cadenas colgando que no se están utilizando y que deberían liberarse. Verifique referencias circulares tal vez registrando la asignación / frees de Class_Initialize/Class_Finalize en Class_Initialize/Class_Finalize