Ver Mensaje Individual
  #1  
Antiguo 15-01-2004
rsotolongo rsotolongo is offline
Miembro
 
Registrado: ene 2004
Posts: 14
Reputación: 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