Какой подходящий способ работать с поздним образованием в Delphi?
-
09-10-2019 - |
Вопрос
На самом деле я использую позднюю связующую среду в Delphi, и мне нужно знать, что это правильный способ поработать с ним.
Моя главная проблема заключается в том, как я обращаюсь с памятью, используемой этими объектами, я должен освободить память?
Проверьте этот пример кода
var
chEaten: Integer;
BindCtx: IBindCtx;
Moniker: IMoniker;
MyObject:: IDispatch;
begin
try
OleCheck(CreateBindCtx(0, bindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr('oleobject.class'), chEaten, Moniker));
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, MyObject));
MyObject.Metod1();
MyObject.Metod2();
finally
MyObject:=nil,// is this necesary?
end;
end;
Было бы полезно, если бы кто -то кратко объяснит, как обрабатывается память в этом типе объектов.
заранее спасибо.
Решение
Объекты интерфейса COM в Delphi автоматически управляются компилятором. Он вводит скрытые призывы к AddRef
а также Release
в соответствующих местах, и ваши интерфейсы автоматически будут иметь свои Release
Методы, вызванные, когда они выходят из масштаба. Так что нет, тебе не нужно ноль из ссылки.
Другие советы
Как сказал Мейсон, память для интерфейсов управляется компилятором для вас. Тем не менее, StringToolest () возвращает выделенный BSTR, который необходимо освободить вручную с помощью sysfreestring (). Вместо этого вы должны использовать тип WealString, который управляет памятью для вас, например:
OleCheck(MkParseDisplayName(BindCtx, PWideChar(WideString('oleobject.class')), chEaten, Moniker));
Или же:
var
w: WideString;
w := 'oleobject.class';
OleCheck(MkParseDisplayName(BindCtx, PWideChar(w), chEaten, Moniker));