Global, seguro de hilo, administrador de cookies con Indy

Mi aplicación Delphi 2010 carga material mediante subprocesos múltiples, los datos cargados se envían a una aplicación PHP / web que requiere inicio de sesión, así que necesito usar un administrador de cookies compartido / global (estoy usandoIndy10 Revisión 4743) ya que TIdCookieManager no es seguro para subprocesos :(

Además, en el lado del servidor, la ID de sesión se genera automáticamente cada 5 minutos, por lo quedebe mantener sincronizados tanto a los administradores de cookies globales como a los locales.

Mi código se ve así:

<code>TUploadThread = class(TThread)
// ...

var
   GlobalCookieManager : TIdCookieManager;

procedure TUploadThread.Upload(FileName : String);
var
   IdHTTP           : TIdHTTP;
   TheSSL           : TIdSSLIOHandlerSocketOpenSSL;
   TheCompressor    : TIdCompressorZLib;
   TheCookieManager : TIdCookieManager;
   AStream          : TIdMultipartFormDataStream;
begin
     ACookieManager := TIdCookieManager.Create(IdHTTP);

     // Automatically sync cookies between local & global Cookie managers
     @TheCookieManager.OnNewCookie := pPointer(Cardinal(pPointer( procedure(ASender : TObject; ACookie : TIdCookie; var VAccept : Boolean)
     begin
          OmniLock.Acquire;
          try
             GlobalCookieManager.CookieCollection.AddCookie(ACookie, TIdHTTP(TIdCookieManager(ASender).Owner).URL{IdHTTP.URL});
          finally
                  OmniLock.Release;
          end;    // try/finally

          VAccept := True;
     end )^ ) + $0C)^;
     // ======================================== //


     IdHTTP         := TIdHTTP.Create(nil);
     with IdHTTP do
     begin
          HTTPOptions     := [hoForceEncodeParams, hoNoParseMetaHTTPEquiv];
          AllowCookies    := True;
          HandleRedirects := True;
          ProtocolVersion := pv1_1;

          IOHandler       := TheSSL;
          Compressor      := TheCompressor;
          CookieManager   := TheCookieManager;
     end;    // with

     OmniLock.Acquire;
     try
        // Load login info/cookies
        TheCookieManager.CookieCollection.AddCookies(GlobalCookieManager.CookieCollection);
     finally
            OmniLock.Release;
     end;    // try/finally

     AStream         := TIdMultipartFormDataStream.Create;

     with Stream.AddFile('file_name', FileName, 'application/octet-stream') do
     begin
          HeaderCharset  := 'utf-8';
          HeaderEncoding := '8';
     end;    // with

     IdHTTP.Post('https://www.domain.com/post.php', AStream);
     AStream.Free;
end;
</code>

¡Pero no funciona! Estoy recibiendo esta excepción al llamar a AddCookies ()

El proyecto MyEXE.exe generó la clase de excepción EAccessViolation con el mensaje 'Infracción de acceso en la dirección 00000000. Lea la dirección 00000000'.

También traté de usar assign (), es decir.

<code> TheCookieManager.CookieCollection.Assign(GlobalCookieManager.CookieCollection);
</code>

Pero sigo teniendo la misma excepción, generalmente aquí:

<code> TIdCookieManager.GenerateClientCookies()
</code>

¿Alguien sabe como arreglar esto?

Respuestas a la pregunta(3)

Su respuesta a la pregunta