Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Incorporar dll al proyecto (https://www.clubdelphi.com/foros/showthread.php?t=56361)

dfarias 15-05-2008 11:20:53

Incorporar dll al proyecto
 
Quisiera saber como hago para incorporar o referenciar a un archivo .DLL dentro de mi proyecto. Es una biblioteca externa que no pertenece al delphi 7. Si quiero ejectar la aplicacion en otros ordenardes debo agregar al .dll o ya al compilar queda todo incluido. Muchas gracias.

cloayza 15-05-2008 16:08:25

Hay dos formas de llamar o usar rutinas que estan contenidas en una dll, y usar estas en tu proyecto delphi.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TfrmMain = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

//Forma 1 Carga estatica-----------------------------
Function Suma(a,b:Single):single; External 'Suma.Dll';

var
  frmMain: TfrmMain;

implementation

{$R *.DFM}

//Forma 1
procedure TfrmMain.BitBtn1Click(Sender: TObject);
Var
   a,b,c:Single;
begin
     //Ejecucion de la funcion_Procedimiento...
     a:=10.0; b:=2.0;c:=0;
     c:=Suma(a,b);
end;

//Forma2 carga dinamica-------------------------
procedure TfrmMain.BitBtn2Click(Sender: TObject);
type
  TSuma = Function(a,b:Single); stdcall;
var
  DLLHandle: THandle;
  Suma: TSuma;
  a,b,c:Single;
begin
  //Carga la libreria 'SUMA.DLL'
  DLLHandle := LoadLibrary('SUMA.DLL');
  try
    if DLLHandle <= 0 then
      ShowMessage('Error Dll no encontrada...');

    //Obtiene la direccion de la funcion 'Suma';
    @Suma := GetProcAddress(DLLHandle, 'Suma');

    if Assigned(Suma) then
    begin
           a:=10.0; b:=2.0;c:=0;
           c:=Suma(a,b);
    end
    else
      ShowMessage('Procedimiento/Funcion no encontrado');

  finally
    Application.ProcessMessages;
    FreeLibrary(DLLHandle);
  end;   
end;

end.

La Dll debe estar junto con tu ejecutable o en una ruta que pueda ser ubicada como por ejemplo x:\windows\system32

Saludos

dfarias 12-11-2008 11:08:49

Estoy probando con el uso del DLL externas y no logro hacer que me devuelvan datos las funciones.

Por ejemplo este unit en la funcion VerVersion si que me devuelve el valor numerico pero no me asigna nada a la variable cadena, la cual se cargaria con los datos de la version i.e.(Rel.4.13) . Creo que el paso por puntero es correcto.


unit Main;

interface

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

type
TForm1 = class(TForm)
AbrirPuerto: TButton;
VerVersion: TButton;
procedure AbrirPuertoClick(Sender: TObject);
procedure VerVersionClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }

cadena:string;

function OpenSerial(PortNumber:LongWord): LongWord;
function CloseSerial:longword;


end;

var
Form1: TForm1;

implementation

function Dll_OpenSerial(PortNumber:LongWord): integer; external 'I:\PRUEBA\DLL_ACCESS_POINT.dll';

function Dll_CloseSerial(PortNumber:longword): longword; external 'I:\PRUEBA\DLL_ACCESS_POINT.dll'

function Dll_GetDllVersion(var cadena): longword; external 'I:\PRUEBA\DLL_ACCESS_POINT.dll'

function Dll_ReqSysInfo(var sInfo:string):longWord; external 'I:\PRUEBA\DLL_ACCESS_POINT.dll'

{$R *.dfm}

procedure TForm1.AbrirPuertoClick(Sender: TObject);

begin

OpenSerial(0);
OpenSerial(1);
OpenSerial(2);
OpenSerial(3);
OpenSerial(4);
OpenSerial(5);

end;


procedure TForm1.VerVersionClick(Sender: TObject);
var
resultado:longWord;

begin
cadena:= '1234567890';
resultado:= Dll_GetDllVersion( cadena);
MensaPanta(resultado);
MensaPanta(cadena);
end;



function TForm1.OpenSerial(PortNumber: LongWord): LongWord;

begin
result:= Dll_OpenSerial(PortNumber);
if result = 1 then
MensaPanta('Abrio')
else
MensaPanta('Error');
end;

end.


Muchas gracias por vuestra ayuda.

cloayza 12-11-2008 15:39:55

Cita:

Empezado por dfarias (Mensaje 325473)
function Dll_GetDllVersion(var cadena): longword; external 'I:\PRUEBA\DLL_ACCESS_POINT.dll'

Creo que le falta el tipo a cadena: String o PChar.

Código Delphi [-]
   function  Dll_GetDllVersion(var cadena:[String/PChar]): longword; external 'I:\PRUEBA

Segundo si el tipo es PChar, te recomiendo hacer

Código Delphi [-]
procedure TForm1.VerVersionClick(Sender: TObject);
var
   resultado:longWord;
   aPChar   : PChar;
begin
      cadena:= '1234567890';
      
      aPChar := StrAlloc(Length(Cadena)+1);
      StrPCopy(aPChar,Cadena);


   resultado:= Dll_GetDllVersion(  aPChar);

   Cadena:=StrPas(aPChar);

   MensaPanta(resultado);
   MensaPanta(cadena);
end;

Saludos y espero te sirva.
Un abrazo
Desde Concepcion-Chile

dfarias 12-11-2008 18:46:49

Gracias cloayza por tu respuesta , pero sigo con el mismo problema.

La funcion me devuelve un 8 pero la cadena queda tal cual se la paso y deberia quedar "4.13 VFP".

Es como si no tomara la referencia de la variable,sino su valor.

Usando la misma .dll desde VB6:mad: . funciona perfecto, me devuelve lo que corresponde.

No se por donde mirarlo ya, estoy danto palos de ciego.




Este es la documentacion del la DLL

Función Dll_GetDLLVersion (ByRef SerialStr As String) As Long .
Esta función devuelve la versión de la Dll.

Parámetros
[out] SerialStr
En esta posición se guarda la versión de la DLL.

Valor que devuelve
Devuelve el número de caracteres almacenados en SerialStr.


La franja horaria es GMT +2. Ahora son las 19:13:25.

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