Ir al contenido


Foto

[RESUELTO] Problema al cargar DLL


  • Por favor identifícate para responder
6 respuestas en este tema

#1 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 19 abril 2011 - 11:52

Buenas tardes, aqui de nuevo con una consultita:

Lo que pasa es que sigo practicando con DLL
ya aprendi a crealos en lazarus (códigos sencillos nomás),
pero ahora el problema es al querer llamarlos desde un form,
por ejemplo he probado con este pequeño codigo:




delphi
  1. library midll;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6.   Classes, interfaces, sysutils, dialogs;
  7.   { you can add units after this }
  8.  
  9. procedure DLLMessage; export;
  10. begin
  11. showMessage('Hola a todos este es mi segundo DLL');
  12. end;
  13.  
  14. exports DLLMessage;
  15.  
  16. {$R *.res}
  17.  
  18. begin
  19. end.




Hasta aquí todo bien, y si estoy en lo correcto esta DLL debe crear un pequeño
cuadrito con el mensaje 'Hola a todos este es mi segundo DLL' al ser llamado,
pero lo que ocurre es que cuando lo llamo desde un boton hecho en un form sale un error
que dice:

Error
El proyecto abrirdll.exe ha lanzado una excepción de la clase 'External: SIGSEGV'



este es mi código (disculpen mi ignorancia si he puesto algo de más):




delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls
  9.   , windows, messages, variants, interfaces;
  10.  
  11. type
  12.  
  13.   { TForm1 }
  14.  
  15.   TForm1 = class(TForm)
  16.     Button1: TButton;
  17.     Edit1: TEdit;
  18.     Label1: TLabel;
  19.     procedure Button1Click(Sender: TObject);
  20.   private
  21.     { private declarations }
  22.   public
  23.     { public declarations }
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29.  
  30.   procedure DLLMessage; stdcall external 'midll.dll';
  31. implementation
  32.  
  33. {$R *.lfm}
  34.  
  35. { TForm1 }
  36.  
  37. procedure TForm1.Button1Click(Sender: TObject);
  38. begin
  39.   DLLMessage;
  40.  
  41.   //loadlibrary('midll.dll');
  42.  
  43. end;
  44.  
  45. end.


         



Si se dan cuenta también he probado con un codigo que dice "loadlibrary" para
ver si sale el cuadrito de Showmessage dentro de la DLL pero nada pasa.....


agradezco su ayuda para lograr abrir esta DLL ....


PD: estos codigos me guio de un ejemplo hecho para delphi...por ser como el primo
de lazarus.....
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 20 abril 2011 - 02:15

Creo que falla porque el metodo de llamada a la funcion está sin definir en la DLL, y por defecto en delphi (y supongo que en lazarus) es "register", mientras que luego en el EXE usas la funcion de la dll llamandola con el metodo "stdcall", asi que EXE y DLL no usan el mismo metodo de llamada a la funcion, lo cual es muy mala cosa.

Yo añadiria en la definicion de la funcon en la DLL explicitamente el metodo de llamada (y eliminaría el "export" que *creo* no se necesita al definir la funcion):



delphi
  1. procedure DLLMessage; stdcall;
  2. begin
  3.   ShowMessage('Hola a todos este es mi segundo DLL');
  4. end;



Otra cosa a probar es dejando la fucnión de la DLL totalmente limpia, que no haga nada, y si el EXE es capaz de llamarla sin problemas, entonces le metes el ShowMessage, por si acaso tubiese algo que ver, así separas el "esqueleto" de la DLL de lo que hacen las funciones.
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 abril 2011 - 07:26

En delphi me funciona bien como lo pongo a continuación, podrías probar quitando en lazaruz (una por una)  las directivas : {$mode objfpo}{$h+} y {R *.res}  a ver que pasa.


delphi
  1. library miDllPrueba;
  2.  
  3. uses SysUtils, Classes, Dialogs;
  4.  
  5. procedure DllMessage; export;
  6. begin
  7.   ShowMessage('Hola mundo') ;
  8. end;
  9.  
  10. exports DllMessage;
  11.  
  12. begin
  13. end.



Y desde el form declarar el procedimiento solo con "external" y no con "stdcall"



delphi
  1. unit UMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     procedure Button1Click(Sender: TObject);
  13.   private
  14.     { Private declarations }
  15.   public
  16.     { Public declarations }
  17.   end;
  18.  
  19. var
  20.   Form1: TForm1;
  21.   procedure DllMessage; external 'miDllPrueba.dll';
  22.  
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27.  
  28. procedure TForm1.Button1Click(Sender: TObject);
  29. begin
  30. DllMessage;
  31. end;
  32.  
  33. end.




  • 0

#4 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 20 abril 2011 - 11:58

Buenas noches con todos, gracias por responder.....
saben probé los procedimientos q me aconsejaron, pero sigue igual o al menos lo intente, pués soy principiante en esto de programar..... como les decia lo probe y sigue igual  : ........

pero lo que me di cuenta (y espero q no suene ridículo) es que construyendo la DLL sin el showmessage osea así:



delphi
  1. procedure DLLMessage; export;
  2. begin
  3. //showMessage('Hola a todos este es mi segundo DLL');
  4. end;



y luego llamandola desde el form creado, ya no sale el error será que es culpa del showmessage.....
espero sus sabias palabras gracias por su atención.....

  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 21 abril 2011 - 08:19

Puedes ver éste hilo que habla precisamente de este asunto que te hace llorar :)

Salud OS
  • 0

#6 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 27 abril 2011 - 01:11

Buenas tardes a todos, le comento que ya pude arreglar mi problemita,
lo hice poniendo este codigo:


CODIGO DE LA DLL:





delphi
  1. library monchito;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6.   Classes, sysutils, dialogs, interfaces;
  7.   { you can add units after this }
  8.  
  9. {$R *.res}
  10. function elroro:string; export;
  11. begin
  12.       result:='Por FIN GRACIASSSSSSS';
  13.    
  14. end;
  15.  
  16. exports elroro;
  17.  
  18. begin
  19. end.





Y este es el código del Programa que lo llama:




delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, windows;
  9.  
  10. type
  11.  
  12.   { TForm1 }
  13.  
  14.   TForm1 = class(TForm)
  15.     Button1: TButton;
  16.     Button2: TButton;
  17.     Edit1: TEdit;
  18.     procedure Button1Click(Sender: TObject);
  19.     procedure Button2Click(Sender: TObject);
  20.   private
  21.     { private declarations }
  22.   public
  23.     { public declarations }
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29. implementation
  30.  
  31.  
  32. function elroro:string; external 'monchito.dll';
  33. {$R *.lfm}
  34.  
  35. { TForm1 }
  36.  
  37.  
  38. procedure TForm1.Button1Click(Sender: TObject);
  39.  
  40. var dato: string;
  41. begin
  42.  
  43. dato:=elroro;
  44. showmessage(dato);
  45.  
  46. end;
  47.  
  48. procedure TForm1.Button2Click(Sender: TObject);
  49. begin
  50.  
  51.   edit1.Text:=elroro;
  52.  
  53. end;
  54.  
  55. end.





Bueno solo lo probe con una DLL bien simplona, pero despues de leer y leer
logré algo siquiera.....

gracias a todos...



  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 27 abril 2011 - 01:26

He fusionado el ultimo mensaje, que de publicó como un tema independiente, con su tema de origen.


Saludos.
  • 0




IP.Board spam blocked by CleanTalk.