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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Evan
Сообщения: 13
Зарегистрирован: 11 июл 2006, 03:42

Здрям. Есть такой код

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

   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:
может подскажите что не так :)
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

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
Evan
Сообщения: 13
Зарегистрирован: 11 июл 2006, 03:42

пробовали не помогает
corb
Сообщения: 4
Зарегистрирован: 13 авг 2006, 01:51

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

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

Просто отказался от удаления. Sink, думаю, сам удалиться т.к ссылок на него больше нет.
Ответить