PDA

Ver la Versión Completa : Fallo en dll


mierda
26-01-2007, 13:13:13
Hola, tengo un fallo ... el caso es que no lo veo ... a ver si desde su perspectiva me lo encuentran ....

Una dll

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

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


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