PDA

Ver la Versión Completa : Ayuda con dll externa


rgarcia_ayala
31-03-2014, 01:50:13
Estimados,

Les solicito una ayuda con este tema pues es mi primer contacto con DLLs.
Necesito ejecutar un metodo de una clase que esta incluida en una dll construida en VB. La clase se llama '_clsSobre' y su metodo es 'Prueba'.

Les pego el codigo que estoy intentando usar:

unit Unit1;

interface

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

type
TForm1 = class(TForm)

Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
MiclsSobre : _clsSobre;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var MiclsSobre : _clsSobre;
begin
MiclsSobre.Prueba;
end;

end.

Cuando ejecuto mi aplicacion me tira el siguiente error:

'project Efactura.exe raised exception class EAccessViolation with ......'

Me pueden ayudar o decir por donde empezar ?

ecfisa
31-03-2014, 03:13:37
Hola rgarcia_ayala, bienvenido a Club Delphi :)

Como a todos los que se inician te invitamos a que leas nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php).

Cuando pongas código en tus mensajes usa TAG's para darle mas claridad como lo explica la siguiente imágen:
http://img403.imageshack.us/img403/3461/75416396.jpg

Saludos :)

Neftali [Germán.Estévez]
31-03-2014, 10:00:40
¿Nos podrías subir la DLL de ejemplo?
¿Es una DLL? ¿Un servidor COM?

En el código que has puesto no hay referencia a la DLL; Debería fallarte al compilar ¿no?

rgarcia_ayala
31-03-2014, 15:24:24
Muchas gracias por responder.

Ok Neftali, te subo la dll en cuestion.

Pero te cuento que finalmente y por ensayo y error pude hacerla funcionar..... Pero sigo sin entender mucho sobre el tema.
Te paso el código que está funcionando:


unit Unit1;

interface

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

type
TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);


private

{ Private declarations }
public
{ Public declarations }
end;

MiclsSobre = class(CoclsSobre); // clase definida en unit eFacturaDLL_TLB y que se encarga de la creacion de la clase _clsSobre, y en
// definitiva la que tiene definido el método 'Prueba'.

var
Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
MiclsSobre.Create.Prueba; // tira el clásico 'Hola mundo'
end;

end.

Neftali [Germán.Estévez]
31-03-2014, 16:15:20
Lo primero es que es un servidor COM, por lo tanto hay que registrarla con regsvr32.

Neftali [Germán.Estévez]
31-03-2014, 16:45:59
(1) Registrar la DLL con regsvr32
(2) Importarla desde Delphi (Import Type Librery) que genera el fichero TLB
(3) Un código similar a este debería bastar para acceder...


uses
eFacturaDLL_TLB;

procedure TForm1.Button1Click(Sender: TObject);
var
i: clsCFE;
j:integer;
begin
i := CoclsCFE.CReate;
j := i.Prueba;
...
end;

rgarcia_ayala
01-04-2014, 02:54:10
Muchas gracias por tus aportes Neftali, han sido de mucha ayuda.
Considero que el tema ha sido resuelto, pero antes me gustaria que me sugirieras algunos hilos para poder entender mejor lo que es servidor COM y lo que es DLL.

Saludos y muchas gracias nuevamente.^\||/

Neftali [Germán.Estévez]
01-04-2014, 14:05:10
Todo son DLL's, no son cosas diferentes.
Si revisas documentación de MIicrosoft encontrarás toda la que necesites.
Una simple búsqueda en Google te dará infinitos resultados.

Empieza por la wiki (http://en.wikipedia.org/wiki/Component_Object_Model).

rgarcia_ayala
19-03-2015, 17:33:38
Estimado Neftali,

Utilizaba una dll externa desarrollada en VB a la cual le han introducido modificaciones y la cual al registrar e instalar no me generó ningún tipo de error.
El problema surge cuando compilo mi aplicación:

[Error] eFacturaCOM_TLB.pas(248): Property setters cannot take var parameters.


uses
Windows, Messages, DateUtils, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, eFacturaCOM_tlb, OleServer;





procedure TForm1.Button1Click(Sender: TObject);
var
cfe : clsCFE;
jj : integer;
el_xml : widestring;
begin

cfe := coclscfe.create;

// cabezal
cfe.AnoEmision := ANOEMISION.Text;
cfe.MesEmision := MESEMISION.Text;
cfe.DiaEmision := DIAEMISION.Text;
cfe.AnoVto := ANOVTO.Text;
cfe.MesVto := MESVTO.Text;
cfe.DiaVto := DIAVTO.Text;
cfe.TipoCFE := strtoint( TIPOCFE_CODIGO.Text );
cfe.IndicadorMBruto := strtoint( IndicadorMbruto_cod.Text );
cfe.FormaPago := strtoint( FormaPago_cod.Text );

...



Adjunto captura del error al compilar y la nueva dll.