Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ayuda para detectar un fallo en diseño de dll (https://www.clubdelphi.com/foros/showthread.php?t=4496)

Sergio 17-10-2003 17:25:45

Ayuda para detectar un fallo en diseño de dll
 
Hola amigos del foro,

Estoy diseñando una dll que, entre otras cosas, abre un Form donde se realiza el Log-In a una aplicacion (Host de la dll). Esta dll ya me funciona en otro aplicación.

Copié el código y el Formulario para diseñar mas o menos lo mismo pero en otra dll nueva, he repasado el código mil veces y no encuentro el fallo.

function EntradaUser(hWnd: THandle): Boolean;
var
frmEntrada: TfrmEntrada;
begin
Application.Handle := hWnd;
frmEntrada := TfrmEntrada.Create(Application);
result := true;
end;

Cuando intenta crear el formulario da el siguiente error:

...raised exception class EOleSysError with message: "No se ha llamado a CoInitialize"...

Gracias de antemano.

delphi.com.ar 17-10-2003 17:43:21

Este error me ha sucedido, pero no en una dll, la solución fue agregar la línea
Código:

Application.Initialize;
antes del Application.Run.

Saludos!

Sergio 17-10-2003 17:55:53

si, pero esta linea ya está en la aplicacion host, en el código de la dll no hay ningún Application.Run,

¿debería haberlo?

gracias por tu ayuda, este es el código de la dll:

library UsersMNM;

uses
SysUtils,
Classes,
FormEntrada in 'FormEntrada.pas' {frmEntrada};

{$R *.res}

exports
EntradaUser;
end.

------------------------

unit FormEntrada;

interface

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

type
TfrmEntrada = class(TForm)
ADOConnection1: TADOConnection;
DBListBox1: TDBListBox;
DBListBox2: TDBListBox;
ds_centros: TDataSource;
ds_usuarios: TDataSource;
sql_centros: TADOQuery;
sql_usuarios: TADOQuery;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;


function EntradaUser(hWnd: THandle): Boolean; StdCall;

implementation

{$R *.dfm}

function EntradaUser(hWnd: THandle): Boolean;
var
frmEntrada: TfrmEntrada;
begin
Application.Handle := hWnd;
frmEntrada := TfrmEntrada.Create(Application);
result := true;
end;

procedure TfrmEntrada.FormCreate(Sender: TObject);
begin
ADOConnection1.Open;
sql_centros.Open;
end;

procedure TfrmEntrada.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOConnection1.Close;
Action := caFree;
end;

end.

roman 17-10-2003 18:33:17

Sergio, no sé mucho de esto pero muchos controles necesitan que se inicialice el manejo de COM y para ello se usa CoInitialize. Supongo que Application.Initialize se encarga de ello normalmente pero esto no ha sucedido para el momento en que creas el formulario. ¿Por qué no pruebas simplemente a hacerlo tú mismo al comienzo del DLL? Me parece que CoInitialize está definido en la unidad ComObj y, hasta donde sé, se puede llamar repetidas veces sin problemas, es decir, que cuando Application lo haga no entrará en conflicto con la llamada que hayas hecho desde el DLL.

// Saludos


La franja horaria es GMT +2. Ahora son las 00:19:37.

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