![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Consumir DLL creado con Delphi 2007 causa error al consumirlo con Delphi 5
codigo de la dll
unit CGIDLL; interface uses Classes, SysUtils, MidItems, Sharemem; function DGetConsumos(usuario, clave, FechaInicial, Fechafinal: AnsiString): AnsiString; cdecl; export; function DGetConsumos(usuario, clave, FechaInicial, Fechafinal: AnsiString): AnsiString; var vFormPrueba: TFormPrueba; begin {$ifdef FULDebug} WriteDebug('Transpose() - Enter'); {$endif} vFormPrueba := TFormPrueba.Create(nil); try Result := vFormPrueba.fGetConsumos(usuario, clave, FechaInicial, Fechafinal); finally vFormPrueba.Free; end; {$ifdef FULDebug} WriteDebug('Transpose() - Exit'); {$endif} end; codigo en delphi 5 para llamar la dll function DCheckUsuario(usuario, clave, tipo: AnsiString): AnsiString; stdcall external 'DLLCGI.dll'; procedure TForm3.ButtonCheckUsuarioClick(Sender: TObject); begin try Memo2.Lines.Text := DCheckUsuario(EditUsuario.Text, EditClave.Text, EditTipo.Text); except end; end; al momento de llamar la funcion genera un acces violation Si se preguntan el porque de una dll en Delphi 2007 para usarse en Delphi 5 es porque tengo que hacer unos llamados a web services muy facil de hacer en delphi 2007 pero no disponible en delphi 5 |
#2
|
||||
|
||||
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración
![]() Recuerda poner los tags al código fuente, ejemplo: ![]() Gracias ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
|||
|
|||
Hola!
Se me ocurren dos posibles motivos: El primero: que en la dll declaras la función como 'cdecl' mientras que en la unit donde la usas la declaras como stdcall. O una o la otra, pero las dos no puede ser. El segundo: no es conveniente al usar dll's crear cosas en un sitio y destruirlas en otro (siendo un sitio la dll y otro el programa, o viceversa). ¿Cómo aplica esto a tu caso? Pues aunque no lo hagas explícitamente, las strings también se crean y se destruyen. Las que pasas como parámetros las crea y las destruye el que llama y las que se devuelven como Result las crea el llamado y las destruye el que llama. Esto es malo y suele dar error. Se soluciona utilizando punteros en lugar de strings (PAnsiChar y PChar). Para los parámetros es trivial, mientras que para el resultado debes modificar la función para que devuelva boolean o integer (así sabes si ha funcionado bien o no, en caso de que lo necesites) y el result debes devolverlo en un parámetro extra también PAnsiChar (un buffer por lo general) (NO hay que declararlo como var). Se suele pasar un segundo parámetro extra para indicar el tamaño de éste buffer para que la función pueda cortar la cadena y evitar que escriba de más y se salga del buffer. P. ej.:
Y su uso:
El código está escrito en el navegador, así que es posible que contenga errores, pero creo que es bastante clarificador. Un saludo, LoPiTaL Última edición por LoPiTaL fecha: 27-07-2012 a las 14:01:05. |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Error con Delphi 2007 y MySql | Paulao | Varios | 1 | 03-01-2011 14:57:04 |
Error en Delphi 2007 | Paulao | Varios | 3 | 01-10-2010 03:26:17 |
WebService en c# consumirlo con delphi | bismarito | Internet | 2 | 18-02-2010 14:19:33 |
error en delphi 2007 | Christian128 | Conexión con bases de datos | 6 | 15-03-2008 19:15:04 |
Error al abirir un DBF creado desde Delphi con un progrma distinto al Database Deskto | DavidLM2007 | Tablas planas | 0 | 03-05-2007 12:57:38 |
![]() |
|