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.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.