PDA

Ver la Versión Completa : Incorporar dll al proyecto


dfarias
15-05-2008, 11:20:53
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.


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
function Dll_GetDllVersion(var cadena): longword; external 'I:\PRUEBA\DLL_ACCESS_POINT.dll'


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

function Dll_GetDllVersion(var cadena:[String/PChar]): longword; external 'I:\PRUEBA

Segundo si el tipo es PChar, te recomiendo hacer

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 (http://www.clubdelphi.com/foros/member.php?u=88) 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.