Estoy tratando de encontrar una forma segura/determinista para liberar una interfaz que está encapsulada en un OleVariant.¿Cuál es la forma correcta de liberar una interfaz detrás de un OleVariant?
AFAICS Delphi publica referencias de interfaz al final de un procedimiento, pero en mi caso tengo que hacerlo antes, porque tengo que cerrar COM.
procedure Test;
var
LLibrary: OleVariant;
begin
CoInitialize(nil);
try
LLibrary := Null;
try
LLibrary := CreateOleObject(LibraryName);
finally
LLibrary := Unassigned; // <-- I would like to release the interface here
end;
finally
CoUninitialize; // <-- Shutdown of COM
end;
end; // <-- The compiler releases the interface here
pensé en poner el OleVariant en una instancia de clase extra que puedo liberar antes de que llame CoUninitialize
.
procedure Test;
var
Container: TLibraryContainer; // Holds the OleVariant
begin
CoInitialize(nil);
try
Container := TLibraryContainer.Create;
try
{...}
finally
Container.Free;
end;
finally
CoUninitialize;
end;
end;
¿Es segura esta solución o hay una solución mejor que he pasado por alto?
La única opción real es usar la rutina secundaria, a menos que disfrute de contar las llamadas a funciones e inspeccionar el código ensamblador generado para asegurarse de que no haya variables locales ocultas. +1 para llamar a su rutina 'DoWork' ...' DoWork', vea mi respuesta eliminada para más detalles. –
@ Cosmin Acepto que la segunda opción es mejor. –
En realidad, mi código real es un poco más sofisticado y creo que tendré que usar su primera variante, pero intentaré refactorizar el código para poder usar el segundo. :) –