Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-06-2005
brandolin brandolin is offline
Miembro
 
Registrado: jul 2003
Ubicación: Mendoza
Posts: 324
Poder: 21
brandolin Va por buen camino
Invalid pointer con DLL

Hola a todos

Estoy haciendo unas dlls para mi aplicacion y en la misma tengo que incluir unas funciones que formateen unos strings y la funcion tiene la siguiente definicion:

Código:
Function ArmarCodCompVenta(TC, STC, SUC, POS, COMP: Integer): String;
var TC1, STC1, SUC1, POS1, COMP1 : String;
begin
    TC1   := LlenarCeros(InttoStr(TC), 2);
    STC1  := LlenarCeros(InttoStr(STC), 1);
    SUC1  := LlenarCeros(InttoStr(SUC), 3);
    Pos1  := LlenarCeros(InttoStr(POS), 4);
    Comp1 := LlenarCeros(InttoStr(COMP), 8);
    ArmarCodCompVenta := TC1+STC1+SUC1+POS1+COMP1;
end;
La dll complia y se crea sin problemas pero cuando se llama desde la aplicacion da un error de "invalid pinter operation".
De las pruebas que he hecho dedusco que el problema esta en el string que devuelve la funcion, ya que si a la misma funcion la reemplazo por la siguiente definicion

Código:
Procedure ArmarCodCompVenta(TC, STC, SUC, POS, COMP: Integer; var Output: String);
var TC1, STC1, SUC1, POS1, COMP1 : String;
begin
    TC1   := LlenarCeros(InttoStr(TC), 2);
    STC1  := LlenarCeros(InttoStr(STC), 1);
    SUC1  := LlenarCeros(InttoStr(SUC), 3);
    Pos1  := LlenarCeros(InttoStr(POS), 4);
    Comp1 := LlenarCeros(InttoStr(COMP), 8);
    ArmarCodCompVenta := TC1+STC1+SUC1+POS1+COMP1;
end;
La misma funciona sin problemas... el problema es mio ya que me queda mucho mas comodo que funcione como funcion y no como prodedure.

¿Alquien sabe porque sucede esto? y obviamente la forma de solucionarlo.

Desde ya muchas gracias.
Responder Con Cita
  #2  
Antiguo 06-06-2005
JOSEPE JOSEPE is offline
Miembro
 
Registrado: feb 2005
Posts: 45
Poder: 0
JOSEPE Va por buen camino
Cuando usas strings para retornar cadenas desde una dll debes declarar en tu programa principal la unidad ShareMem.

Espero que soluciones tu problema.

Salu2.

JOSEPE

Última edición por JOSEPE fecha: 06-06-2005 a las 23:19:23.
Responder Con Cita
  #3  
Antiguo 07-06-2005
brandolin brandolin is offline
Miembro
 
Registrado: jul 2003
Ubicación: Mendoza
Posts: 324
Poder: 21
brandolin Va por buen camino
siempre es bueno leer los comentarios.... en este caso la solucion a mi problema lo ponia el mismo delphi en un comentario cuando se crea la DLL y dice asi:

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }


Traduciendo se puede ver que la solucion a mi problema es colocar la sharemem y distribuir con mi aplicacion la dll BORLNDMM.DLL o bien remplazar todos los String por un ShortString. Esto ultimo fue lo que hice y funciono a las mil maravillas.....

Gracias JOSEPE por el consejo... sirvio de mucho...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:44:05.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi