FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Hola!
Cuando usas DLLs debes tener cuidado con el paso de parámetros que se crean / destruyen dinámicamente fuera de tu control, esto es, tipos de datos "managed", como por ejemplo strings. El compilador lleva internamente el conteo de las instancias de una string, de tal forma que cuando se deja de referenciar, la destruye automáticamente. Por eso se pueden hacer operaciones tipo 'mistring'+'miotrastring' y ya se encarga el compilador de crear una nueva string donde quepan todos los caracteres, etc... Sin embargo, cuando trabajas con DLLs, el compilador deja de tener ese control sobre estos tipos de datos, por lo que si se le pasa a una DLL una cadena para que la almacene, y la función que llama deja de referenciar a esta cadena, ésta se destruirá provocando AV en la DLL, que cree que la cadena todavía existe. Es por esto por lo que con enteros te ha funcionado, pero con strings no. El mismo RAD Studio te da información sobre ésto cuando creas una nueva DLL. En el archivo principal de la DLL te aparece el siguiente comentario:
Esto se puede resolver evitando el paso de parámetros de tipo manejado. Esto es, reemplazando parámetros string, AnsiString, etc... por parámetros tipo PChar, PAnsiChar, etc... y en la DLL recrear la string mediante StrPas. De igual forma, el resultado devuelto NO debe ser manejado, por lo que deberías hacer lo mismo, devolver PChar y en la función llamante recrear la string con StrPas. También se puede evitar si en lugar de DLLs usas BPLs, pero dejas de ser compatible con otros lenguajes. Por otro lado, veo que no tienes bien definida la cabecera en Delphi. Si usas char * en C, debes usar PAnsiChar en Delphi (por lo que también tendrías resuelto el problema que te comento anteriormente). Y el resultado de la función es char (sin puntero), por lo que el resultado en Delphi deberá ser AnsiChar (sin la P). Ahh! Y ojo con PChar y PAnsiChar, ya que en Delphi2007+ PChar es Unicode (puede ser 1, 2 ó 4 bytes), mientras que PAnsiChar es el de 1 byte de siempre. Espero haberte ayudado. Un saludo, LoPiTaL |
#2
|
|||
|
|||
hola
LoPiTaL gracias por tu atencion. aun me queda un problema una duda sobre la variable que recibe el valor de la dll arregle asi
en el show message obtengo un 3 y se supone que deberia de ser un 3333 bueno una cadena de cuatro 3 en delphi 2010 no me dejsa usar strpas que no se puede llamar con esos argumentos
|
#3
|
|||
|
|||
Hola!
Veo varias cosas mal en tu código, te comento:
DLLName sí que es constante. DLLFunc es una variable.... primero apunta a nil, y después a la dirección de la función en la DLL. Por tanto, cámbialo por:
Segundo, estás liándote con la carga de la DLL. Puedes cargar una DLL de dos formas: Así, siendo la carga automática (la palabra far te sobra....): O de esta otra forma, que sería manual: pero no de las dos formas a la vez!!! Las dos son igual de válidas, pero si usas la primera, si la librería no existe tu aplicación no arrancará, mietras que si usas la segunda puedes controlar esto y hacer otras cosas, o no usar la funcionalidad que proporciona etc... La más sencilla es la primera, por supuesto. Tercero: StrPas recibe un PChar (o PAnsiChar) como parámetro y devuelve un string. Por supuesto no puedes hacer StrPas(resultadosuma), ya que resultadosuma es string, no PAnsiChar. Para usarlo bien deberás usarlo así:
Cuarto: Si quieres que suma devuelve una cadena de texto, NOOOOO puede devolver AnsiChar, ya que AnsiChar es un carácter sólo!!! Deberá devolver un PAnsiChar, exactamente igual que lo harías en c. Ahora tendrás un puntero a una cadena, el cual puedes pasarle a StrPas para que te genere la string correcta. Creo que eso es todo.... Un saludo, LoPiTaL |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Como instalo ZeosLib en Delphi 2010 | jorosmtz | Conexión con bases de datos | 21 | 21-08-2012 00:48:46 |
delphi 2010 imagenes png¿como usarlas? | JXJ | Varios | 2 | 13-09-2010 21:40:49 |
Hacer que Delphi 2010 luzca como Delphi 7 | jorosmtz | La Taberna | 0 | 11-04-2010 22:45:36 |
¿cómo hacer un reporte con ravereport de delphi 2010 o un manual ? | Master23 | Impresión | 1 | 06-04-2010 16:43:20 |
Iniciar un Loader | REHome | .NET | 5 | 24-12-2008 10:24:29 |
|