COM_INTERFACE_ENTRY_BREAK макросы не работают - PullRequest
1 голос
/ 06 марта 2012

У меня есть класс ATL.Я хотел бы знать, когда QueryInterface этого класса вызывается для устранения утечек памяти.

Я добавил COM_INTERFACE_ENTRY_BREAK в COM_MAP, теперь это выглядит так:

BEGIN_COM_MAP( CMyClass )
      COM_INTERFACE_ENTRY( IFace1 )
      COM_INTERFACE_ENTRY( IFace2 )

      //COM_INTERFACE_ENTRY_BREAK(IUnknown) // i included this too
      COM_INTERFACE_ENTRY_BREAK( IFace1 )
      COM_INTERFACE_ENTRY_BREAK( IFace2 )
END_COM_MAP()

Когда я начинаю отладку (нажимая F5), у меня нет точки останова после операции QI.Я уверен, что QI вызывается, потому что _ATL_DEBUG_INTERFACES показывает утечку в окне вывода

ATL: QIThunk - 4 LEAK : Object = 0x02150CC0 Refcount = 1 MaxRefCount = 2 CMyClass - IUnknown

Что я должен сделать, чтобы остановить точку останова при вызове QI?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Очевидно, что вам нужна точка останова при вызове AddRef (), а не вызов QI.Да, больно, поиск ошибок подсчета ссылок в клиентском коде с сервера не очень хорошо работает, если вы используете оболочки ATL.В остальном принципиально не отличается от попытки диагностики утечек памяти путем установки точки останова на операторах new / delete, что тоже не работает.

Вы можете установить точку останова на метод InternalAddRef () внутри atlcom.h.Но это может быть шумно, и это может привести к тому, что отладчик на некоторое время станет кататоническим, если на вашем сервере много интерфейсов.

1 голос
/ 07 марта 2012

Я решил проблему с макросом COM_INTERFACE_ENTRY_FUNC_BLIND следующим образом:

BEGIN_COM_MAP(CMyClass)
  COM_INTERFACE_ENTRY(IDummy) // NB!: this has to go before COM_INTERFACE_ENTRY_FUNC_BLIND
  COM_INTERFACE_ENTRY_FUNC_BLIND(0, MyQueryInterface)
END_COM_MAP

MyQueryInterface - это функция, вызываемая каждый раз, когда интерфейс запрашивает.

Моя функция:

QueryInterfaceFunc ( void* pv, REFIID riid, LPVOID* ppv, DWORD dw )
{
  if (riid == __uuidof(IFace1))
  {
    DebugBreak(); // Break here in the case of querying IFace1
  }
}
...