FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Error de lectura de puerto serie "Memoria Insuficiente".
hola a todos.
Tengo una dll que uso para comunicar un dispositivo conectado al puerto COM con un programa ya realizado, la funcion que hace la lectura del puerto funciona perfectamente desde un formulario interno de la misma DLL, pero al hacer el llamado de la funcion de lectura del puerto desde el programa, realiza la funcion de apertura del puerto, la funcion del dispositivo para realizar la transaccion, pero cuando va a leer el puerto sale un mensaje que dice "memoria Insuficiente". estuve viendo con un monitor de puerto que realmente se envia los datos. aqui esta el codigo de la DLL obviamente en DELPHI:
y aqui esta el codigo de la aplicacion que usa la DLL y desafortunadamente en ViSUAL: Código:
Private Declare Function leebanda Lib "C:\pnp\dllcredicard.dll" () As String Public retorno As String Public x As String Private Sub boton_leer_banda_Click() Dim txt As String Dim token As String Dim msj As String ' Se llama a la función del VPOS para leer la banda de tarjetas de créditos y débitos retorno = leebanda ' Se obtiene el valor del string que retorna la función del VPOS ' este string posee los valores de los tracks de la tarjeta a la cual se le leyo la banda x = retorno retorno = GetToken(retorno, ";") '& vbCrLf Do token = GetToken("", ";") If token = "" Then Exit Do retorno = retorno '& vbCrLf txt = token Loop ' Se asigna en la box de texto el valor de los diferentes tracks If retorno <> "" Then var = InStr(1, retorno, "?") msj = Mid(retorno, 2, var - 2) txt_track1.Text = msj Else txt_track1.Text = "" End If If txt <> "" Then var = InStr(1, txt, "?") msj = Mid(txt, 1, var - 2) txt_track2.Text = msj Else txt_track2.Text = "" End If End Sub ' Esta función parte el string de acuerdo a un caracter de separación que se le pasa en su invocación Public Function GetToken(new_txt As String, delimiter As String) As String Static txt As String Dim pos As Integer ' Save new text. If new_txt <> "" Then txt = new_txt pos = InStr(txt, delimiter) If pos < 1 Then pos = Len(txt) + 1 GetToken = Left$(txt, pos - 1) pos = Len(txt) - pos + 1 - Len(delimiter) If pos < 1 Then txt = "" Else txt = Right$(txt, pos) End If End Function Última edición por clavijo83 fecha: 03-04-2009 a las 19:43:20. Razón: no esta tomando la etiqueta [DELPHI] |
#2
|
||||
|
||||
¿Porque lo tienes aislado en una DLL y no utilizas el MSComm para leerlo directamente desde VB?...
Tu código esta incompleto, igualmente veo un error evidente: No puedes retornar un string en la función leebanda si pretendes leerlo desde VB, ya que string es un tipo propietario de pascal, donde utiliza uno o dos bytes de longitud, para pasárselo a VB te recomiendo que retornes un “Null terminated char” (PChar) PD: Te recomiendo emplolijar un poco la identación de tu código, se hace algo incomprensible. Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
|||
|
|||
hola Federico.
bueno lo tengo aislado porque hay muchos programas que usan esta DLL, lo que estoy haciendo es mi propia version de la DLL, por lo que tengo que dejarle las mismas funciones y procedimientos o mas bien dejarle los mismo nombres. estuve haciendo la DLL en visual para usar el MSComm y realmente habian mas problemas, en algunos lados me reconocia la DLL en otros no. por lo que opte a hacerla en delphi que es donde esta hecha actualmente la DLL original. porque dices que mi codigo esta incompleto? solo hace falta ahi la estructura de la funcion "AbrirPuerto". aquie te la agrego.
estuve tratando cambiandole el tipo de dato a PChar y bueno al hacer la lectura la primera vez no sale nada, hago la lectura nuevamente y se sale solo de la aplicacion. |
#4
|
||||
|
||||
Sigo viendo incoherente te código, entiendo que lo debes haber recortado de tu aplicación. Fijate el tratamiento que haces con la variable Result, primero que no se trata de una función sino de un procedure, luego le asignas un valor y posteriormente lo sobreescribes a True. Los parámetros de este procedimiento siguen siendo "String". Ademas, veo que en las funciones anteriores no se le da importancia al resultado de "AbirPuerto".
Hice un breve resumen de la DLL si cambiar las partes que no entiendo del código, y no me falla, salvo que no exista el puerto o este este abierto.
Cita:
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#5
|
|||
|
|||
hola federico bueno la verdad ya me funciono ya retorna un valor la funcion llebanda, la funcion quedo asi:
pero ahora hay un problema en el codigo de visual: Código:
Private Sub boton_leer_banda_Click() Dim txt As String Dim token As String Dim msj As String ' Se llama a la función del VPOS para leer la banda de tarjetas de créditos y débitos retorno = leebanda ' Se obtiene el valor del string que retorna la función del VPOS ' este string posee los valores de los tracks de la tarjeta a la cual se le leyo la banda 'x = retorno retorno = GetToken(retorno, ";") '& vbCrLf Do token = GetToken("", ";") If token = "" Then Exit Do retorno = retorno '& vbCrLf txt = token Loop ' Se asigna en la box de texto el valor de los diferentes tracks If retorno <> "" Then var = InStr(1, retorno, "?") msj = Mid(retorno, 2, var - 2) 'AQUI APARECE EL ERROR txt_track1.Text = msj Else txt_track1.Text = "" End If If txt <> "" Then var = InStr(1, txt, "?") msj = Mid(txt, 1, var - 2) txt_track2.Text = msj Else txt_track2.Text = "" End If End Sub |
#6
|
|||
|
|||
hola federico bueno la verdad ya me funciono ya retorna un valor la funcion llebanda, la funcion quedo asi:
pero ahora hay un problema en el codigo de visual: Código:
Private Sub boton_leer_banda_Click() Dim txt As String Dim token As String Dim msj As String ' Se llama a la función del VPOS para leer la banda de tarjetas de créditos y débitos retorno = leebanda ' Se obtiene el valor del string que retorna la función del VPOS ' este string posee los valores de los tracks de la tarjeta a la cual se le leyo la banda 'x = retorno retorno = GetToken(retorno, ";") '& vbCrLf Do token = GetToken("", ";") If token = "" Then Exit Do retorno = retorno '& vbCrLf txt = token Loop ' Se asigna en la box de texto el valor de los diferentes tracks If retorno <> "" Then var = InStr(1, retorno, "?") msj = Mid(retorno, 2, var - 2) 'AQUI APARECE EL ERROR txt_track1.Text = msj Else txt_track1.Text = "" End If If txt <> "" Then var = InStr(1, txt, "?") msj = Mid(txt, 1, var - 2) txt_track2.Text = msj Else txt_track2.Text = "" End If End Sub Y me sale en la funcion MID de visual, porque sera eso? ah no uso la otra funcion que me pusiste de leebanda, porque no puedo cambiarle la estructura. asi hacen la llamada en los programas que ya usan esta DLL. |
#7
|
||||
|
||||
Cita:
Cita:
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#8
|
|||
|
|||
consulta delphi
hola chicos, soy nuevo en el sitio, y me surgio un problema en lo que es funciones en delphi.
estuve haciendo una calculadora, y precisaba sacar la raiz, entonces utilice la funcion SQRT, pero preciso saber una funcion en la cual eleve cualquier número, me de el resultado, sea cual sea a la raiz que la eleve, alguien sabe de esta funcion. muchas gracias y espero puedan ayudarme. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Error al LLamar un DLL, "memoria Insuficiente" | clavijo83 | Varios | 0 | 02-04-2009 18:34:50 |
Lectura Hexadecimal desde el puerto serie | djemix | Varios | 20 | 09-12-2007 15:22:55 |
Particiones en "solo lectura " con cd_live de knoppix | Diavlo | Linux | 1 | 03-10-2007 04:06:26 |
error de sql server "Informacion de columna clave insuficiente" | jhcaboverde | Conexión con bases de datos | 1 | 17-08-2007 19:40:31 |
Fast Report "Fuera de memoria" | BECERRA | Impresión | 0 | 25-12-2005 12:40:29 |
|