FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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; 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; ¿Alquien sabe porque sucede esto? y obviamente la forma de solucionarlo. Desde ya muchas gracias. |
#2
|
|||
|
|||
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 22:19:23. |
#3
|
|||
|
|||
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... |
|
|
|