Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Invalid pointer con DLL (https://www.clubdelphi.com/foros/showthread.php?t=22092)

brandolin 06-06-2005 20:16:29

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.

JOSEPE 06-06-2005 22:00:03

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

brandolin 07-06-2005 04:53:14

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...


La franja horaria es GMT +2. Ahora son las 21:59:03.

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