Ver Mensaje Individual
  #2  
Antiguo 16-11-2013
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 219
Reputación: 20
rcarrillom Va por buen camino
[Resuelto]

Saludos al foro

Hemos encontrado el problema de las excepciones y comparto la solución para quien pueda servirle.

El proyecto originalmente consta de un lado cliente EXE y un lado servidor DLL DCOM, originalmente todo bajo D7 a 32 bits. Cuando se hizo la portación del código servidor de D7 a XE3 para 32/64 bits, empezaron a surgir errores extraños que detectamos eran fallas de FreeAndNil por objetos no inicializados dentro de los DLL compiladas con XE3 para 64 bits, extrañamente el mismo código compilado con XE3 para 32 bits no marcaba excepciones. Hicimos pruebas con código casi identico al del proyecto combinando SO de 32/64 bits con EXE 32 bits y DLLs 32/64 bits y la unica combinacion que no marcaba error fue DLL creados con D7 corriendo en Win 64, contrario a la documentacion de Borland/Embarcadero que dice que las variablesl locales no se inicializan y de entrada traen basura, en los watch aparecian inicializadas a nil dentro del DLL, esta extraña condicion siempre estuvo presente y por esta razon no habia excepciones. Este fue el primer detalle curioso.

Después de una maratónica sesión de google y de una lista de posibles causas, la última razón y que nadie creyó posible, fué investigar la convencion de llamada safecall (usada casi exclusivamente en interfaces DCOM) ya que en la declaracion de los eventos y métodos que generamos en las pruebas no aparece, siendo la convencion predeterminada register si no me equivoco, resulta que la particularidad que tiene safecall es establecer un "firewall" para las excepciones entre el invocador y el método invocado, aunque existan errores en el DLL no llegan al cliente y como la liberacion estaba en un bloque try finally end, se hacia todo el proceso al 100% y desaparecia la excepcion por arte de magia, ya que se debe preguntar a traves de una interfaz al objeto DCOM; al parecer siempre hubo errores pero nunca salieron a la luz.

Sumado a esto, la documentación técnica dice que para X64 ya solo existe un solo tipo de llamada y dejan de existir los fastcall, register, cdecl, safecall, etc. y obviamente esto hizo desaparecer la barrera para las excepciones y fué la receta perfecta para el desastre.

En resumen, safecall ocultaba las excepciones en 32 bits y en 64 bits solo existe un tipo de llamada y se manifestaron los errores.

Ahora solo queda buscar esas lineas propensas a fallos a ojo pelón adiós dia lunes no laborable...
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita