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 15-01-2004
rsotolongo rsotolongo is offline
Miembro
 
Registrado: ene 2004
Posts: 14
Poder: 0
rsotolongo Va por buen camino
Problemas con OleAutomation y los Indy9 en Delphi7

Hola:

Es la primera vez que escribo a la lista, y lo hago porque realmente el problema que tengo se me va de las manos y no le encuentro solución.

Resulta que tengo una aplicación que se conecta a un servidor de correo mediante el compente POP3 de los Indy Clients y toma los mensajes que ahi hay y me los da como un TIdMessage cada uno.

Yo necesitaba que dicho mensaje fuera OleAutomation por lo que hice un cascarón que englobara el objeto TIdMessage, pero necesitaba que de alguna forma este se pudiera inicializar con los valores provenientes de otro TIdMessage "duro" por lo que decidí aprovechar el método LoadFromStream del TIdMessage.

Así que en la interface del cascarón declaré un método que se llama LoadFromOleVariant que se le pasa un OleVariant, el lo convierte de cierta forma a un Stream y luego llama al LoadFormStream del objeto que tiene dentro. Por supuesto solo quedaba que desde afuera una vez se vayan obteniendo los correos con el TIdPOP3 convertirlos adecuadamente a OleVariant.

Esto lo hice con estas dos funciones que a continuación pongo:



program Test;

{$APPTYPE CONSOLE}

uses
SysUtils,
Classes,
IdMessage,
Variants;

function ConvertToOleVariant(const Source : TIdMessage) : OleVariant;

var
Stream : TMemoryStream;
Buffer : OleVariant;
PBuffer : PByteArray;

begin
Stream := TMemoryStream.Create;
Source.SaveToStream(Stream);
Buffer := VarArrayCreate([0, Stream.Size], varByte);
PBuffer := VarArrayLock(Buffer);
Stream.Read(PBuffer^, Stream.Size);
VarArrayUnlock(Buffer);
result := Buffer;
end;

procedure LoadFromOleVariant(const Source : OleVariant; Dest : TIdMessage);

var
Stream : TMemoryStream;
PSource : PByteArray;

begin
Stream := TMemoryStream.Create;
PSource := VarArrayLock(Source);
Stream.Write(PSource^, VarArrayHighBound(Source, 1));
VarArrayUnlock(Source);
Stream.Position := 0;
Dest.LoadFromStream(Stream);
end;


var
Msg : TIdMessage;
Ole : OleVariant;

begin
Msg := TIdMessage.Create(nil);
Ole := ConvertToOleVariant(Msg);
LoadFromOleVariant(Ole, Msg);
end.



Si corren esta aplicación les dará una excepción a la hora de la llamada al LoadFromStream en el método LoadFromOleVariant. No sé el porqué de esta excepción. La misma es EIdReadTimeout con el mensaje "Read Timeout". Les hago estas aclaraciones para que se sitúen en el contexto, por favor ayúdenme con lo que puedan.

Ricardo A. Sotolongo
rsotolongo2000@yahoo.es
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 23:11:41.


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