Какой подходящий способ работать с поздним образованием в Delphi?

StackOverflow https://stackoverflow.com/questions/3983526

Вопрос

На самом деле я использую позднюю связующую среду в 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)); 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top