Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Fallo en dll (https://www.clubdelphi.com/foros/showthread.php?t=39663)

mierda 26-01-2007 13:13:13

Fallo en dll
 
Hola, tengo un fallo ... el caso es que no lo veo ... a ver si desde su perspectiva me lo encuentran ....

Una dll

Código Delphi [-]
library FormDLL;
uses
  sharemem,SysUtils,
  Classes,dialogs,
  UfrmPrincipal in 'UfrmPrincipal.pas' {frmPrincipal};
{$R *.res}
// Para mostrar el formulario "frmPrincipal".
//
function MostrarFormulario : boolean; stdcall;
begin
  Result := true;
  frmPrincipal := TfrmPrincipal.Create(nil);
  try
    frmPrincipal.ShowModal;
  finally
    frmPrincipal.Free;
  end;
end;
function suma(x,y:integer):integer;stdcall;
begin
  suma := x+y;
end;
function muestrasaludo:boolean;stdcall;
begin
 Result := true;
 showmessage('Hola');
end;
exports
  MostrarFormulario,suma,muestrasaludo; // Exportamos la función.
end.

y un exe que la llama

Código Delphi [-]
unit UfrmPrueba;
interface
uses
  sharemem,Windows, Forms, Classes, Controls, StdCtrls,dialogs,sysutils;
type
  TfrmPrueba = class(TForm)
    btnFormulario: TButton;
    Button1: TButton;
    Button2: TButton;
    procedure btnFormularioClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;
var
  frmPrueba: TfrmPrueba;
// Declaración de la función sita en la "DLL"
function MostrarFormulario : boolean; external 'FormDLL.dll' name 'MostrarFormulario';
function suma(x,y:integer): integer;external 'FormDLL.dll'  name 'suma';
function muestrasaludo:boolean;external 'FormDLL.dll' name 'muestrasaludo';
implementation
{$R *.dfm}
procedure TfrmPrueba.btnFormularioClick(Sender: TObject);
begin
  MostrarFormulario; // Usamos la función externa
end;
procedure TfrmPrueba.Button1Click(Sender: TObject);
var
resultado: integer;
begin
resultado := suma(3,4);
showmessage (inttostr(resultado));
end;
procedure TfrmPrueba.Button2Click(Sender: TObject);
begin
muestrasaludo;
end;
end.

la unica funcion que no me funciona es la de la suma ... la mas facil :)

Gracias por adelantado

seoane 26-01-2007 13:25:03

:confused: En la dll veo que declaras las funciones con la directiva stdcall, entonces porque cuando las importas no utilizas la misma directiva

Código Delphi [-]
function MostrarFormulario : boolean; stdcall; external 'FormDLL.dll' name 'MostrarFormulario';
function suma(x,y:integer): integer;  stdcall; external 'FormDLL.dll'  name 'suma';
function muestrasaludo:boolean;  stdcall; external 'FormDLL.dll' name 'muestrasaludo';

Te preguntaras por que solo la suma parecía funcionar mal, pues es debido a que la directiva stdcall solo indica como se deben de pasar los parámetros a la función, así que como suma es la única de las funciones con parámetros es la única que parecía funcionar mal.

mierda 26-01-2007 13:53:34

puuuuuuuuuufff que paketeeee!!!
 
:o ya ves .... ke fallo mas tontooooooo!!! si es q 18 ojos ven mas que dos.

Muchas gracias ... y un saludo.

PabloTech 26-01-2007 14:13:30

A mi no me funciona
 
Hola muchachos...

Estuve probando el código de Uds. y después de cerrar la aplicación se produce una excepción inesperada:confused: . Si lo corro al sistema desde Delphi, la excepción es:

Project PruebaDll raised exception class EInvalidPointer with message invalid pointer operation...

Y, si lo corro desde el Explorador de archivos también, y dice:

Se ha producido una excepción inesperada del programa en la dirección tal...

Yo lo que hice fueron dos proyectos. Un proyecto para la Dll e incluí el formulario frmPrincipal; y el otro, para el ejecutable que llamé PruebaDll.
¿Qué pude haber hecho mal?:(

Gracias...;)

mierda 26-01-2007 17:18:48

Si .... tienes que quitar del uses el sharemem
 
Hola nen, yo tambien me di cuenta y es que hay que quitar el sharemem de la clausula uses ....

ya que creo que eso solo hay que ponerlo en la dll si esta va a ser usada por otro lenguaje de programacion ... sino es asi ... corregirme.

Un saludo!!

PD: en la dll tienes que crear un form tambien .... si quieres ver el ejemplo completo.

PabloTech 26-01-2007 22:41:27

Agradesimiento
 
Cita:

Estas en los cierto Lucas
… Digo, tienes razón acerca de quitar el
sharemem de la aplicación.

:confused: Ahora, ¿dónde podremos encontrar otros trucos sobre las dlls? ¿Tu sabes?
Posdata: Yo estoy programando en Delphi 6:rolleyes:


La franja horaria es GMT +2. Ahora son las 12:38:11.

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