Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-12-2005
arantzal arantzal is offline
Miembro
 
Registrado: oct 2004
Posts: 80
Poder: 20
arantzal Va por buen camino
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.

Última edición por jachguate fecha: 01-12-2005 a las 16:36:58. Razón: Añadir etiqueta [delphi]
Responder Con Cita
  #2  
Antiguo 01-12-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 01-12-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Sería bueno ver el código de CreateIt... ¿Llamas al constructor heredado dentro de este?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 01-12-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 02-12-2005
arantzal arantzal is offline
Miembro
 
Registrado: oct 2004
Posts: 80
Poder: 20
arantzal Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 02-12-2005
arantzal arantzal is offline
Miembro
 
Registrado: oct 2004
Posts: 80
Poder: 20
arantzal Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 02-12-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
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?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #8  
Antiguo 05-12-2005
arantzal arantzal is offline
Miembro
 
Registrado: oct 2004
Posts: 80
Poder: 20
arantzal Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:05:44.


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
Copyright 1996-2007 Club Delphi