Как правильно работать с LateBinding в Delphi? - PullRequest
3 голосов
/ 21 октября 2010

На самом деле я использую позднее связывание в 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;

было бы полезно, если бы кто-то кратко объяснил, как обрабатывается память в объектах этого типа.

спасибо ввперед.

Ответы [ 2 ]

3 голосов
/ 21 октября 2010

COM-интерфейс объектов в Delphi автоматически управляется компилятором.Он вставляет скрытые вызовы к AddRef и Release в соответствующих местах, и ваши интерфейсы будут автоматически вызывать свои методы Release, когда они выходят из области видимости.Так что нет, вам не нужно ноль из ссылки.

0 голосов
/ 21 октября 2010

Как сказал Мейсон, память для интерфейсов управляется компилятором для вас. Однако StringToOleStr () возвращает выделенный BSTR, который необходимо освободить вручную с помощью SysFreeString (). Вместо этого вы должны использовать тип WideString, который управляет памятью, например:

OleCheck(MkParseDisplayName(BindCtx, PWideChar(WideString('oleobject.class')), chEaten, Moniker)); 

Или:

var
  w: WideString;

w := 'oleobject.class';
OleCheck(MkParseDisplayName(BindCtx, PWideChar(w), chEaten, Moniker)); 
...