Ir al contenido


Foto

Uso de DLL


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

#1 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 20 febrero 2010 - 12:08

Hola
Estoy empezando con esto de la dll y viendo ejemplos pero no entiendo.
Tengo esto:
DLL


delphi
  1. uses SysUtils, Classes, Dialogs;
  2.  
  3. {$R *.res}
  4.  
  5. Procedure Naty(nada: string); export;
  6.  
  7. begin
  8.   nada:= 'hola';
  9.   ShowMessage(nada);
  10. end;
  11.  
  12. exports Naty;
  13.  
  14. begin
  15. end.



La dll envia un mensaje, eso lo hace bien, pero lo que quiero es recibir el dato.

Lo llamo asi:


delphi
  1. procedure Naty(nada: String); external 'Caral1.dll';
  2.  
  3. procedure TForm1.FormCreate(Sender: TObject);
  4. begin
  5.   Naty(nada);
  6.   Showmessage(nada);
  7. end;



Me muestra primero el mensaje de la dll bien, pero no me muestra el dato.

Me explicais como puedo obtener el dato de un string de una dll.?
Saludos
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 12:25

Lo que pasa es que estas usando un procedimiento (que ejecuta correctamente) pero 'nada' no existe a menos que uses una función que regrese un valor.



delphi
  1. library Caral;
  2.  
  3. uses
  4.   SysUtils,
  5.   Dialogs,
  6.   Classes;
  7.  
  8. {$R *.res}
  9.  
  10. Function Naty(nada: string):string; export;
  11.  
  12. begin
  13.   ShowMessage(nada);
  14.   result := 'Regresa cadena: ' + nada;
  15. end;
  16.  
  17. exports Naty;
  18.  
  19. begin
  20. end.



y ahora si lo llamas desde tu programa




delphi
  1.   function Naty(nada: String):string; external 'Caral.dll';
  2.  
  3. procedure TForm1.Button1Click(Sender: TObject);
  4. var
  5.   CadenaDLL: string;
  6. begin
  7.   CadenaDLL := Naty('Prueba de Mensaje desde DLL');
  8.   ShowMessage(CadenaDLL);
  9. end;



Salud OS
  • 0

#3 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 20 febrero 2010 - 12:39

Hola
Funciona a medias.
Me sale un error de invalid pointer operation.
No se por que.
Saludos
  • 0

#4 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 20 febrero 2010 - 01:03

Hola
A ver que estoy haciendo mal:
DLL


delphi
  1. uses SysUtils, Classes, Dialogs;
  2.  
  3. {$R *.res}
  4.  
  5. Function Naty(dato: string):string; export;
  6. begin
  7.   dato:= 'hola';
  8.   result := dato;
  9. end;
  10.  
  11. exports Naty;
  12.  
  13. begin
  14. end.



La llamo asi:


delphi
  1.   function Naty(dato: String):string; external 'Caral1.dll';
  2.  
  3. procedure TForm1.FormCreate(Sender: TObject);
  4. var dato2: string;
  5. begin
  6.   dato2 := Naty(' ');
  7.   ShowMessage(dato2);
  8. end;


Saludos
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 01:32

No entiendo porqué quieres reasignar la variable dato dentro de la función Naty....



delphi
  1. Function Naty(dato: string):string; export;
  2. begin
  3.   dato:= 'hola'; // No entiendo esto
  4.   result := dato;
  5. end;



Yo haría esto....



delphi
  1. Function Naty(dato: string):string; export;
  2. begin
  3.   if dato = ' ' then
  4.     result := 'nada'
  5.   else result := dato;
  6. end;





delphi
  1.   function Naty(dato: String):string; external 'Caral1.dll';
  2.  
  3. procedure TForm1.FormCreate(Sender: TObject);
  4. var dato2: string;
  5. begin
  6.   dato2 := Naty(' ');
  7.   ShowMessage(dato2);
  8.   dato2 := Naty('algo');
  9.   ShowMessage(dato2);
  10. end;



Salud OS

  • 0

#6 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 20 febrero 2010 - 01:38

Hola
A ver si me hago entender.
Lo que quiero es que la dll tenga un dato, en este caso string 'hola'.
Cuando llame a la dll desde el programa, quiero recibir ese dato, osea el hola.
Es asi o no se puede?
Saludos
Gracias por la ayuda amigo
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 01:43

Todo se puede amigo, el asunto es para que envias un dato a la dll si no vas a hacer nada con ese dato, si lo que quieres es enviar solo 'hola', puedes hacer esto



delphi
  1. Function Naty(dato: string):string; export;
  2. begin
  3.   result := 'hola';
  4. end;



Simplemente ignoras la variable dato, que como lo veo de nada te sirve :p o de plano quitarla



delphi
  1. Function Naty:string; export;
  2. begin
  3.   result := 'hola';
  4. end;




Salud OS
  • 0

#8 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 20 febrero 2010 - 01:48

Que tal caral, si solo deseas que te regrese un dato creo que podrias intentarlo asi



delphi
  1. Function Naty:string; export;
  2. begin
  3.  
  4.   result := 'hola';
  5.  
  6. end;

 

y al llamarlo



delphi
  1.   function Naty:string; external 'Caral1.dll';
  2.  
  3. procedure TForm1.FormCreate(Sender: TObject);
  4. var dato: string;
  5. begin
  6.   dato2 := Naty;
  7.   showmessage(dato2);
  8. end;



o



delphi
  1.   function Naty:string; external 'Caral1.dll';
  2.  
  3. procedure TForm1.FormCreate(Sender: TObject);
  4. begin
  5.   showmessage(Naty);
  6. end;



A mi muy peculiar punto de vista

Saludos

Kafastoforman
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 01:53

Pues si, asi es de fácil.

Te adjunto mi ejemplito.

Salud OS

Archivos adjuntos


  • 0

#10 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 20 febrero 2010 - 07:52

Hola
Funciona a medias.
Me sale un error de invalid pointer operation.
No se por que.
Saludos


Pues a mi me da el mismo error el ejemplito de egostar al salir de la aplicacion
  • 0

#11 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 20 febrero 2010 - 08:01

Hola
Funciona a medias.
Me sale un error de invalid pointer operation.
No se por que.
Saludos


Cuando se trabaja con cadenas de tipo string en una dll, hay que añadir la unit SharedMem al principio de las uses del proyecto.

Como bien dice la ayuda de delphi

Shared-Memory Manager (Win32 Only)
On Win32, if a DLL exports routines that pass long strings or dynamic arrays as parameters or function results (whether directly or nested in records or objects), then the DLL and its client applications (or DLLs) must all use the ShareMem unit. The same is true if one application or DLL allocates memory with New or GetMem which is deallocated by a call to Dispose or FreeMem in another module. ShareMem should always be the first unit listed in any program or library uses clause where it occurs.


  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 08:35


Hola
Funciona a medias.
Me sale un error de invalid pointer operation.
No se por que.
Saludos


Pues a mi me da el mismo error el ejemplito de egostar al salir de la aplicacion


Ah caray, a mi no me da ningún tipo de error, y eso que lo estoy haciendo con Delphi4 :s

Salud OS
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 febrero 2010 - 08:47

Eliseo,
Al archivo zip de muestra le faltó algo importante.... ¡la dll!

Por otra parte... ¿que no es que hay que hacer un loadLibrary/FreeLibrary? ;)

Saludos,
  • 0

#14 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 08:55

Eliseo,
Al archivo zip de muestra le faltó algo importante.... ¡la dll!

Por otra parte... ¿que no es que hay que hacer un loadLibrary/FreeLibrary? ;)

Saludos,


No faltó amigo, la dll se llama Caral y la debes de compilar, así como ejecutar el Project1 :D

El load/free library es cuando la DLL es cargada dinámicamente ¿no?

Salud OS
  • 0

#15 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 febrero 2010 - 09:09

Hola Amigo,
No te enojes si te digo que falta la dll. Porque he bajado tu proyecto y cuando compilo me dice que falta la dichosa dll. Además me he tomado la molestia de ver si realmente está entre los archivos y tengo la total certeza de que no está.

Respecto a LoadLibrary/FreeLibrary lo dije porque en muchos ejemplos que he visto hacen uso de esto... Yo también tengo entendido que eso se emplea cuando se carga dinámicamente... pero los ejemplos me hacen dudar.

Saludos,
  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 09:14

Hola Amigo,
No te enojes si te digo que falta la dll. Porque he bajado tu proyecto y cuando compilo me dice que falta la dichosa dll. Además me he tomado la molestia de ver si realmente está entre los archivos y tengo la total certeza de que no está.

Respecto a LoadLibrary/FreeLibrary lo dije porque en muchos ejemplos que he visto hacen uso de esto... Yo también tengo entendido que eso se emplea cuando se carga dinámicamente... pero los ejemplos me hacen dudar.

Saludos,


Acabo de bajar el zip y ahí están los archivos, solo tienes que compilar caral.dpr para generar la dll :s

Salud OS

Archivos adjuntos


  • 0

#17 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 febrero 2010 - 09:22

Ha... Me faltó ese detalle... Yo compilé Proyect1 :p
Entonces, retiro lo dicho.

Ya probé el demo y si, funciona. Y como dicen los chicos, al cerrar tu aplicación viene la excepción invalid pointer operation.

¿Será lo que dice Domingo?
Pues... añadí ShareMem e igual apareció el error. :s

Saludos,
  • 0

#18 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 09:28

Vaya, que cosas, les adjunto el EXE y la DLL a ver si es por su versión de Delphi, a mi no me da ningún problema :s

Salud OS

Archivos adjuntos


  • 0

#19 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 febrero 2010 - 09:32

Pues ahora si funca.
He probado tu Bin.zip y no se ve el error. Aparentemente algo ha cambiado en la forma de trabajar con las dlls de D4 a D6.

Saludos,
  • 0

#20 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 09:38

Pues ahora si funca.
He probado tu Bin.zip y no se ve el error. Aparentemente algo ha cambiado en la forma de trabajar con las dlls de D4 a D6.

Saludos,


Pues no, acabo de compilar la DLL y el EXE con Turbo Delphi y tampoco me muestra error :s

Deberían de checar sus máquinas :p

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.