ClientDataSets con Delphi5 Enterprise

Tengo el siguiente problema con ClientDataSets con Delphi5 Enterprise:

Mi aplicacin principal llama a mis DLLs a varios niveles:
 Aplicacin => DLL 1 => DLL 2 ...

 La Aplicacin llama a la DLL 1, la DLL 1 llama a la DLL2 ...

En la Aplicacin se conecta una tabla con un provider y un clientdataset
(para control de reconciles). En cada DLL se clona el client de la
Aplicacin a travs de un package. Hay que decir que la Aplicacin tiene el
cdigo del reconciles, la DLL1 solo visualiza los datos, y ls DLL 2 los
modifica.

?Cul es el problema?
Pues la primera vez que desde la aplicacin llegamos al segundo nivel de
DLLs todo funciona bien, incluso se modifican los valores y se ejecutan
correctamente los reconciles.
El problema aparece una vez que realizamos el ciclo por segunda vez. Se
puede observar que al realizar los post en la DLL2, los registros quedan en
estado de edicin, con lo cual el Delta parece quedar en un estado de error.
Algunas veces incluso sale en pantalla "INVALID BLOB HANDLE IN RECORD
 BUFFER".
  Se ha probado a desactivar los clients clonados de manera que solo exista
una clonacin activa independientemente del nivel de profundidad de DLLs
llamadas y funciona igual.
  Se ha probado que la nica forma de que no de errores es desactivando los
componentes del Arranque y volviendolos a activar, pero este proceso es
lento.

Los campos con los que trabajo son BLOB. Se ha probado con y sin fetchblobs.
El error aparece trabajando con sentencias del tipo:

IF _ClientDataSetProduccionDepartamento.active=True THEN
            BEGIN
               with _ClientDataSetProduccionDepartamento do
               begin
                       if Changecount>0 then
                         begin
                              try
                                 CANCELUpdates;
                              finally
                                 if Changecount>0 then
                                 begin
                                       try
                                         active:=false;
                                       finally

_TableProduccionDepartamento.active:=false;
                                       end;
                                 end;
                              end;
                         end;
end;
             END;
********************************************************************
IF _ClientDataSetProduccionDepartamento.active=true THEN
          BEGIN
             with _ClientDataSetProduccionDepartamento do
             begin
if Changecount>0 then ApplyUpdates(-1);
end;
          END;
********************************************************************

try
                WITH _TableProduccionDepartamento DO
                BEGIN
                       if active=false then active:=true
                       else
                           refresh;
                END;
               finally
                with _ClientDataSetProduccionDepartamento do
                begin
                   IF NIVEL_DE_PROFUNDIDAD_DE_PROGRAMA>1 THEN
                   BEGIN
                               if active=false
                               then
                                    active:=true;
                   END
                   ELSE
                   BEGIN
                      try
                       if active=false
                       then
                            active:=true
                       else
                         if active=true then
                            if Changecount>0 then cancelupdates;

                      finally

file://_ClientDataSetProduccionDepartamento.DATA:=_DataSetProviderProduccion
Departamento.DATA;
if _TableProduccionDepartamento.RecordCount=recordCount
                            then
                            begin
                             if RecordCount>0 then
                             begin
                                  first;
                                  _TableProduccionDepartamento.first;
                                  repeat
                                        try
//                                           if
_TableProduccionDepartamento.locate('......',
//                                                     varArrayOf([
//                                                         ................
//                                                                ]),
//
[LoCaseInsensitive])=true
//                                           then
                                           begin
                                                if
_TableProduccionDepartamento.FieldByName('ultima_grabacion').value<>FieldByN
ame('ultima_grabacion').value then
                                                begin
                                                   RefreshRecord;
                                                   file://FetchBlobs;
                                                end;
                                           end;
                                        finally
                                            next;

_TableProduccionDepartamento.next;
                                        end;
                                  until eof=true;
                             end;
                            else
                            begin
                             try
                                active:=false;
                             finally
                                active:=true;
                             end;
                            end;
                      end;
                   END;
                end;
               end;

 con lo que nos estamos asegurando que en caso de quedar actualizaciones
pendientes de realizar, se desactive el client y su tabla para
posteriormente cargarlos de nuevo (lo cual siempre funciona de forma
correcta):

Los clonecursor  se realizan con las opciones FALSE, TRUE.

TableXXX.CloneCursor(_ClientDataSetXXX, false, TRUE);

SI ALGUIEN INTUYE QUE ES LOS QUE ME EST PASANDO RUEGO ME CONTESTE.

dom...@vnet.es

A la Atencin de Adrin Castillo.