![]() |
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. |
Este error me ha sucedido, pero no en una dll, la solución fue agregar la línea
Código:
Application.Initialize; Saludos! |
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. |
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 02:32:10. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi