Я пытаюсь найти безопасный/детерминированный способ освобождения интерфейса, который заключен в OleVariant.Каков правильный способ освободить интерфейс за OleVariant?
AFAICS Delphi выпускает ссылки на интерфейс в конце процедуры, но в моем случае я должен сделать это раньше, потому что мне нужно отключить 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
Я хотя сдачи OleVariant дополнительного экземпляр класса, который я могу бесплатно, прежде чем я называю 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;
Является ли это решение безопасным или есть лучшее решение, которое я упустил?
Единственная реальная опция - использовать вторичную подпрограмму, если вам не нравятся вызовы функций подсчета и проверка сгенерированного кода ассемблера, чтобы убедиться, что нет скрытых локальных переменных. +1 для вызова вашей подпрограммы 'DoWork' ...' DoWork', см. Мой удаленный ответ для деталей. –
@Cosmin Я согласен, что второй вариант лучше. –
На самом деле мой настоящий код немного сложнее, и я думаю, что мне придется использовать свой первый вариант, но я попытаюсь реорганизовать код, чтобы я мог использовать второй. :) –