Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Providers (https://www.clubdelphi.com/foros/forumdisplay.php?f=10)
-   -   Consumir DLL creado con Delphi 2007 causa error al consumirlo con Delphi 5 (https://www.clubdelphi.com/foros/showthread.php?t=79657)

rchavezh 26-07-2012 20:15:22

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

Casimiro Notevi 26-07-2012 20:31:30

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 :)

LoPiTaL 27-07-2012 13:53:43

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

Código Delphi [-]
function DGetConsumos(usuario, clave, FechaInicial, Fechafinal: PAnsiChar; Buffer: PAnsiChar; BufferSize: integer): boolean; cdecl; export;

Y su uso:

Código Delphi [-]
const
  MiDLLName='DLLCGI.dll';

function DCheckUsuario(usuario, clave, tipo: AnsiString): AnsiString; cdecl external MiDLLName name 'DCheckUsuario';
procedure TForm3.ButtonCheckUsuarioClick(Sender: TObject);
var
  LBuffer: array [0..29] of AnsiChar;
begin
try
  DCheckUsuario(PAnsiChar(EditUsuario.Text), PAnsiChar(EditClave.Text), PAnsiChar(EditTipo.Text), @LBuffer[0], 30);
  Memo2.Lines.Text := StrPas(@LBuffer[0]);
except
end;
end;

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 04:08:54.

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