Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error THilo QueryInterface (https://www.clubdelphi.com/foros/showthread.php?t=27812)

arantzal 01-12-2005 10:02:52

Error THilo QueryInterface
 
Buenas,
tengo un error que no consigo solucionar, os lo explico para ver si alguien me puede ayudar.

En el código creo un hilo de la siguiente forma:
Código Delphi [-]
 
type
  THilo = class(TThread)
    ModoAdm : boolean;
    protected
      procedure Execute; override; // Main thread execution
    published
      constructor CreateIt (Modo : boolean); 
      destructor Destroy; override;
     public
  end;
 
El procedimiento execute lo tengo así:
 
procedure THilo.Execute;
var
  Conn : string;
  Can: boolean;
  Manejador: INTEGER;
begin
      Manejador := LoadLibrary('Library1.dll');
      if Manejador <> 0 then
        begin
            Can:= GetProcAddress(Manejador, 'Gestion')<> nil;
            if Can then
            Gestion(Id, Conn);
        end
      else
        begin
          CopyFichero('Library.dll');
          //Y vuelvo a empezar...
          Execute;
        end;
end;
 
 
Y llamo al hilo de la siguiente forma:
....... 
if (MiHilo = nil) or (HiloActivo = false) then // make sure its not already running
begin
          MiHilo:= THilo.CreateIt(false);
          HiloActivo := true;
end
else//Le conduzco al proceso
begin//La dll está cargada, sólo tengo que ejecutar la función
        ............................... 
end;

Pero a hacer el createit(false) me da el siguiente error:
QueryInterface for Interface Borland.Vcl.IMalloc failed. ¿Alguna idea? Si quito el hilo me va bien, así que supongo que será que algo del hilo que está mal. Si a alguien se le ocurre algo.....


Gracias de antemano.
Saludos.

jachguate 01-12-2005 15:36:05

Hola.

En esta ocasión he editado tu mensaje para añadir la etiqueta [delphi] al código publicado. Creo que ya es tiempo que aprendas a usarla, pues seguro notas la diferencia en la presentación del mismo :eek:

Hasta luego.

;)

delphi.com.ar 01-12-2005 15:47:24

Sería bueno ver el código de CreateIt... ¿Llamas al constructor heredado dentro de este?

delphi.com.ar 01-12-2005 15:51:30

Tengo un par de observaciones sobre esto tu código:

¿No ten convendría iniciar la DLL y apuntar los procedimientos en el constructor?...

Código Delphi [-]
CopyFichero('Library.dll');
//Y vuelvo a empezar...
Execute;
Yo haría un cilco propiamente dicho, ademas no tienes garantías que esto sea eterno y vuelque la pila.

Saludos!

arantzal 02-12-2005 09:26:54

Buenas,
en primer lugar gracias jachguate por editar mi mensaje.

En segundo lugar, el código de CreateIt es el siguiente:
Código:

constructor THilo.CreateIt(Modo : boolean);
begin
  inherited Create(false);
  ModoAdm := Modo;
end;

Y el procedimiento de la dll a la que llamo lo tengo declarado así:
Código:

 
procedure Gestion(Id: integer; Con: variant); external 'Library1.dll' ;

En la aplicación llamo a más dll's pero sin hilo y no me dan ningún problema.Pero al poner el hilo surgen mis quebraderos de cabeza.

delphi.com.ar no entiendo lo que me quieres decir con que harías un ciclo. Si puedes explicarmelo te lo agradecería.

Saludos y gracias.

arantzal 02-12-2005 13:23:04

Buenas,

ya he conseguido solucionar el problema. He tenido que añadir la siguiente linea:
Código:


{%DelphiDotNetAssemblyCompiler 'c:\archivos de programa\archivos comunes\borland shared\bds\shared assemblies\3.0\Borland.VclAdoDb.dll'}


.

Saludos y gracias.

delphi.com.ar 02-12-2005 13:33:12

Cita:

Empezado por arantzal
delphi.com.ar no entiendo lo que me quieres decir con que harías un ciclo. Si puedes explicarmelo te lo agradecería.

Con cualquiera de las instrucciones de control de flujo (repeat, while), verificando que no cicle eternamente.
¿Te funciona el código si lo sacas del Thread?

arantzal 05-12-2005 16:36:08

Buenas,
ahora tengo un problema a la hora de acceder por segunda vez al procedimiento Gestión de la dll. La primera vez me deja sin problemas pero las siguientes me da el siguiente error:

System error. Code 1400.
El identificador de la ventana no es válido.



El código del procedimiento de la dll es el siguiente:

Código:

procedure GestionarVentaPacks(IdUsuario: integer;Conn: variant); 
export;
begin

 frm := TfrmGestVentPacks.Create(nil);
 frm.ADOConnRecData_Bilbao.ConnectionString := Conn; 
 frm.IdUsuario := IdUsuario;
 frm.Visible := true;
 frm.Handle;
 
 while (frm.HandleAllocated) do
 Application.ProcessMessages;
 end;

Alguna idea?

Saludos y gracias.


La franja horaria es GMT +2. Ahora son las 09:15:56.

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