Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con OleAutomation y los Indy9 en Delphi7 (https://www.clubdelphi.com/foros/showthread.php?t=6615)

rsotolongo 15-01-2004 05:18:01

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


La franja horaria es GMT +2. Ahora son las 20:18:46.

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