Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Como llamar a una DLL de Windows u otras externas (https://www.clubdelphi.com/foros/showthread.php?t=95728)

TOLO68 17-06-2022 23:20:19

Como llamar a una DLL de Windows u otras externas
 
Hola a todo el foro.
Hacia varios años que no escribia por aqui.

He creado una Dll, ADD.DLL , que suma o resta 2 numeros, es muy sencilla porque la uso de pruebas, para ver la compatibilidad con varios lenguajes.

Me va bien en Visual Basic 6, VB.Net 2010 y SharpDevelop , incluso sin registrar la Dll en el sistema, y teniendolas en la misma carpeta que el EXE

en estos lenguajes las declaro asi......

Private Declare Function SumaNumeros Lib "add.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
Private Declare Function RestaNumeros Lib "add.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Ahora quiero probarlas en Delphi, tengo la version 7, o si puede ser, en Lazarus de FreePascal, ya que quiero probar si son compatibles con otros lenguajes que no sean Basic.

Ojo, no se programar en Delphi, pero tampoco me suena todo a chino, je je

Antes de escribir en el foro, he buscado por Google, me sale la funcion DLLIMPORT , pero solo suele haber ejemplos para DLLs propias de windows, y los ejemplos

Y tambien, he leido algo de STDCALL y CDECL , que no tengo muy claro lo que es.

Muchas gracias a todos por adelantado.

Saludos desde España!!!

Neftali [Germán.Estévez] 20-06-2022 10:14:50

Por lo que se, que no es mucho, te comento a ver si te da alguna pista o algún hilo a partir del cual tirar...

Diría que las DLLs que implementes en Visual o en C# las puedes usar desde delphi utilizando COM. Deberás registrarlas y desde Delphi usar las opciones de importación y no deberías tener mayores problemas.

DLLImport (si es lo mismo que me suena a mi) es una opción que puedes usar desde .NET para generar DLL's, que pluego puedes usar desde delphi con un LoadLibrary, sin necesidad de registrarlas. Es decir, que te simplifica mucho las cosas.

Te pongo algo de código (de memoria) de cómo sería la Definición/llamada en Delphi; Suponiendo que hayas conseguido usar DLLImport y puedas usarla directament sn registrar.

Código Delphi [-]
...
var 
  // La cabecera de la función asegurate de que tiene el sdtcall;
  funcAdd: function (a:Integer; b:integer):integer; stdcall;

...
var

begin
  ...
  // Cargar la DLL
  FDll := LoadLibrary('add.dll');
  if FDll=0 then
  begin
    ShowMessage('No se ha podido cargar la DLL  );
  end else
  ShowMessage('Dll  cargada correctamente');

  // Intentar acceder al método
  funcAdd:= GetProcAddress(FDll,'SumaNumeros');
  if @funcAdd=nil then
  begin
    ShowMessage('No se ha podido cargar el método SumaNumeros');
  end;

  // llamada a la funcion de suma
  res := funcAdd(3 + 5);

Revisa este link:
http://es.uwenku.com/question/p-wjnivalk-bx.html
Explica lo mismo creo, con algunos detalles más.

TOLO68 20-06-2022 15:53:11

Hola a todos !!!

Neftali, muchas gracias, ya pude solucionarlo lo de Suma y Resta, con un conversor de VB6 a Delphi.
Tu ejemplo lo probe, y no me dejaba compilar, me daba errores al cargar la DLL.

La Dll anterior se llamaba add.dll, aqui es fb_dll.dll, es la misma, solo que añadi las funciones Mayusculas y Minusculas.

La DLL la he creado con freebasic, y este es el codigo de la funciones dentro la DLL, por si sirve de algo.
Las 4 funciones, van bien en Visual Basic 6, VB.Net 2010, SharpDevelop y ThinBasic ( en ThinBasic tengo que declarar las funciones como alias, pero es cosa del compilador, me lo dijo el autor)

Código SQL [-]
------------- Codigo DLL FreeBasic-------------

#include once "windows.bi"
#include once "win/ole2.bi"

EXTERN "windows-ms"

    FUNCTION Suma(BYVAL N1 AS Integer, BYVAL N2 AS Integer) AS Integer EXPORT
        RETURN  N1 + N2
    END FUNCTION
    
    FUNCTION Resta(BYVAL N1 AS Integer, BYVAL N2 AS Integer) AS Integer EXPORT
        RETURN N1 - N2
    END FUNCTION
    
    FUNCTION Mayusculas (BYVAL Texto as zString ptr) AS BSTR EXPORT
        DIM res AS BSTR, s AS STRING
        s = UCASE(*Texto)
        res = SysAllocStringByteLen(STRPTR(s), LEN(s))
        RETURN res
    END FUNCTION
    
    FUNCTION Minusculas (BYVAL Texto as zString ptr) AS BSTR EXPORT
        DIM res AS BSTR, s AS STRING
        s = LCASE(*Texto)
        res = SysAllocStringByteLen(STRPTR(s), LEN(s))
        RETURN res
    END FUNCTION
    
END EXTERN

------------- Fin Codigo DLL -------------


Este es el codigo sacado del conversor de VB6, a Delphi o Lazarus.
Para los numeros me va bien.
Pero vi que no me va bien para los string.....

Código Delphi [-]
-------------Codigo Delphi ---------------

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

  function Suma(N1: Smallint; N2: Smallint): Smallint; stdcall; external 'fb_dll.dll' name 'Suma';
  function Resta(N1: Smallint; N2: Smallint): Smallint; stdcall; external 'fb_dll.dll' name 'Resta';
  function Mayusculas(Texto: String): String; stdcall; external 'fb_dll.dll' name 'Mayusculas';

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

////// Label1.Caption := Mayusculas('mipalabra');  <---- Aqui da un error en Delphi 7.0 , o no devuelve nada en Lazarus.

Label1.Caption := IntToStr(Suma(10,22));  <---- Esta funcion va OK

end;
end.

-------------Fin Codigo Delphi ---------------

Realmente esta Dll es para usar en VB o Basic, pero si puedo usarla en mas lenguajes, como por ejemplo Delphi, pues mucho mejor.

Gracias a todos y que tengan un buen dia !!!!!!
Saludos !!!!!

Neftali [Germán.Estévez] 20-06-2022 16:25:09

Gracias por compartirlo.
^\||/^\||/^\||/^\||/^\||/

TOLO68 20-06-2022 19:17:03

De nada Neftali.

Pero piensa, que solo funcionan las Sumas y Restas, pero "NO" las Mayusculas ni Minusculas.

Pero es una forma sencilla de llamar a una Dll.

A ver si alguien sabe como hacerlo en Delphi, ya que en VB y demas va bien Mayusculas y Minusculas.

Saludosss!!!

Neftali [Germán.Estévez] 21-06-2022 08:23:08

Cita:

Empezado por TOLO68 (Mensaje 547228)
Pero piensa, que solo funcionan las Sumas y Restas, pero "NO" las Mayusculas ni Minusculas.

Posiblemente por el tipo de dato.
No puedes usar string para DLLs. tendrías que cambiarlo por PChar o PAnsiChar.

TOLO68 21-06-2022 09:43:06

O sea, en el codigo de delphi o Lazarus....

function Mayusculas(Texto: String): String; stdcall; external 'fb_dll.dll' name 'Mayusculas';

Tengo que cambiar String por Pchar o PAnsichar???

Lo probare, gracias!!!!

Neftali [Germán.Estévez] 21-06-2022 11:18:52

Si. Primero prueba con PAnsiChar.
Para trabajar con DLLs lo normal es usar punteros y eso se traduce en PChar o PAnsiChar/PWideChar.

TOLO68 21-06-2022 11:44:24

Netfali !!!!!!!
Era por estooooo !!!!

#:-)##:-)##:-)#

Ya lo probe con PAnsiChar y Pchar , en Lazarus, y funciona de las 2 maneras, asi que me imagino que tambien funcionara en Delphi 7.

Lo que me hacia ultimamente, era darme un numero en vez de una palabra, o sea algo leia.

Ahora ya se que FreeBasic crea bien las DLLs, y que no era problema de la Dll, si no por no saber Delphi, esto tambien lo tenia visto en C.

Muchas gracias !!!!!
Me lo apunto en un papel para la proxima vez.

Que tengais todos un buen dia.
||-||


La franja horaria es GMT +2. Ahora son las 14:44:48.

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