![]() |
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 |
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 :) |
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 |
La franja horaria es GMT +2. Ahora son las 18:16:52. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi