Ver Mensaje Individual
  #7  
Antiguo 24-11-2015
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por dec Ver Mensaje
Jamás había tenido que tocar nada de la VCL hasta hoy.
Es preferible que no lo hagas. Yo he tenido la inmensa fortuna de conseguir darle la vuelta a este tipo de problemas casi siempre que me he topado con alguno, sin tener que modificar código fuente ajeno. Más importante aún si tal código no es libre e implica volver a hacer lo mismo con otras versiones de Delphi.

Eché un vistazo a TOleControl y su método GetProperty:
Código Delphi [-]
procedure TOleControl.GetProperty(Index: Integer; var Value: TVarData);
var
  Status: HResult;
  ExcepInfo: TExcepInfo;
begin
  CreateControl;
  Value.VType := varEmpty;
  Status := FControlDispatch.Invoke(Index, GUID_NULL, 0,
    DISPATCH_PROPERTYGET, DispParams, @Value, @ExcepInfo, nil);
  if Status <> 0 then DispatchInvokeError(Status, ExcepInfo);
end;
Creo que hay oportunidad de sustituir el valor del campo FControlDispatch ahí visto, que es una interfaz, por una segunda interfaz que envuelva a la primera, pero copiando desde el nuevo método Invoke el valor devuelto por el viejo Invoke en el seudo-variante Value (cuando éste sea una interfaz) hacia una variable que posteriormente usemos para reducir el contador de forma controlada, en tiempo y forma. Evitando así la inundación y potencial desborde de la memoria.

Ahora no dispongo de mucho tiempo, pero en estos días podemos desarrollarlo aquí mismo entre los compañeros interesados en el tema. Podría ser un buen ejercicio colectivo.

Un saludo.

Al.
Responder Con Cita