Страница 1 из 1

удаление ИнтерфейсоВ

Добавлено: 01 авг 2006, 00:52
Evan
Здрям. Есть такой код

Код: Выделить всё

   uses ActiveX, Mshtml;

   type
      TSinkObj = class (TInterfacedObject, IDispatch, IPropertyNotifySink,
      IOleClientSite)

   procedure ...
    var
          Doc                   : IHTMLDocument2;
          Sink                  : TSinkObject;
          ConnectionPoint : IConnectionPoint;
          Cookie              : integer;
  begin
      Sink := TSinkObj.Create;
      if not Succeeded ( CoCreateInstance(CLASS_HTMLDocument,
         nil, CLSCTX_INPROC_SERVER ,IHTMLDocument2, Doc) ) then
      error('Create Instance');

     (Doc as IOleObject).SetClientSite(sink as IOleClientsite);
     (Doc as IOleControl).OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL);
     (Doc as IConnectionPointContainer).FindConnectionPoint(IpropertyNotifySink, ConnectionPoint);
    ConnectionPoint.Advise(Sink as IPropertyNotifySink, Cookie);
     // здесь делаем кое что  с Doc
    
    (Doc as IOleObject).SetClientSite(nil);
    ConnectionPoint.Unadvise(Cookie); 
    Sink.Destroy;
  end;
программа вылетает на Sink.Destroy и пишет Invalid pointer operation. херня какая то :evil:
может подскажите что не так :)

Re: удаление ИнтерфейсоВ

Добавлено: 09 авг 2006, 01:19
Naeel Maqsudov
Delphi Help писал(а): It is not recommended coding style to call Destroy directly. Call Free instead. Free checks to ensure that the object reference is not nil before calling Destroy.
Так что попробуйте Free

Добавлено: 12 авг 2006, 00:20
Evan
пробовали не помогает

Добавлено: 13 авг 2006, 02:33
corb
2 варианта:
1. Эт вряд ли, но может Sink не доживает до конца процедуры (проверьте пошагово).
2. На Sink сформировались линки, которые после удаления объекта становятся битыми (ссылаются на несуществующий объект).

Да и вообще, после создания интерфейсного объекта вызывать его явное удаление нельзя - интерфейсные объекты самоуничтожаются при потере на них ссылок.
В данном случае я бы предложил вам заменить
Sink : TSinkObject;
на
Sink : IInterface;
и отказаться от явного удаления объекта. Т.о. объект будет автоматически уничтожен при обнилении последней ссылки.

Добавлено: 13 авг 2006, 03:24
Evan
Просто отказался от удаления. Sink, думаю, сам удалиться т.к ссылок на него больше нет.