Компилятор явно использует неявную переменную локального интерфейса для возвращаемого значения из CreateOleObject
. Затем он освобождается в конце процедуры, слишком поздно для вас.
Есть несколько способов победить это. Прежде всего, вы можете явно указать ссылку на интерфейс IDispatch
, возвращаемую CreateOleObject
. Это позволяет контролировать его время жизни.
procedure Test;
var
intf: IDispatch;
LLibrary: OleVariant;
begin
CoInitialize(nil);
try
intf := CreateOleObject(LibraryName);
try
LLibrary := intf;
finally
VarClear(LLibrary);
intf := nil;
end;
finally
CoUninitialize;
end;
end;
Альтернативой может быть перемещение кода, вызывающего CreateOleObject
, в отдельную подпрограмму со своей областью действия.
procedure DoWork;
var
LLibrary: OleVariant;
begin
LLibrary := CreateOleObject(LibraryName);
//do stuff with LLibrary
end;
procedure Test;
begin
CoInitialize(nil);
try
DoWork;
finally
CoUninitialize;
end;
end;
Поскольку неявная локальная ссылка находится в области действия DoWork
, она освобождается в конце DoWork
и, следовательно, перед запуском CoUninitialize
.
Моя рекомендация - использовать второй вариант, который чище и заставляет компилятор выполнять работу от вашего имени.