Почему AddRef возвращает ноль

Я отлаживаю C ++ / COM-приложение, глядя на то, как мы AddRef и Release COM-объекты. Я натолкнулся на странный случай, когда AddRef возвращает 0. Вот как я получаю возвращаемое значение:

ULONG TraceAddRef(LPUNKNOWN pUnk, const std::string &a_msg) {
ULONG count = pUnk->AddRef(); // count == 0 at some point after execution
ATLTRACE("%s *** AddRef:  pUnk = 0x%p, referenceCount = %lu\n", a_msg.c_str(), pUnk, count);
return count;
}

pUnk — это на самом деле интерфейс IWebBrowser2 COM для веб-элемента управления:

pUnk    0x20d763ac  IUnknown *
__vfptr 0x5d85b0d8  const CFrameWebOC::`vftable'{for `IWebBrowser2'}

Я посмотрел в Disassembly (режим сборки отладки) для этой строки:

    ULONG count = pUnk->AddRef();
6515A52C  mov         eax,dword ptr [pUnk]
6515A52F  mov         ecx,dword ptr [eax]
6515A531  mov         esi,esp
6515A533  mov         edx,dword ptr [pUnk]
6515A536  push        edx
6515A537  mov         eax,dword ptr [ecx+4]
6515A53A  call        eax
6515A53C  cmp         esi,esp
6515A53E  call        _RTC_CheckEsp (65323F90h)
6515A543  mov         dword ptr [count],eax

В этот момент eax 0 на линии 6515A543,

В отладчике, когда я иду в строку 6515A53Aтам он покажет следующий код:

    CFrameWebOC::AddRef:
5D707B6D  mov         edi,edi
5D707B6F  push        ebp
5D707B70  mov         ebp,esp
5D707B72  push        edi
5D707B73  mov         edi,dword ptr [ebp+8]
5D707B76  inc         dword ptr [edi-18h]
5D707B79  cmp         dword ptr [edi-18h],2
5D707B7D  je          CFrameWebOC::AddRef+26h (5D707B93h)
5D707B7F  test        dword ptr [edi-4],0FFFFFFFCh
5D707B86  jne         5DF2DD04
5D707B8C  xor         eax,eax
5D707B8E  pop         edi
5D707B8F  pop         ebp
5D707B90  ret         4
5D707B93  push        esi
5D707B94  lea         esi,[edi-8]
5D707B97  call        CTrackerHelper::SetAsRoot (5D85AD2Fh)
5D707B9C  pop         esi
5D707B9D  jmp         CFrameWebOC::AddRef+12h (5D707B7Fh)
5D707B9F  nop

На линии 5D707B76 Значение dword ptr [edi-18h] кажется контрольным счетчиком, значение которого является правильным, ненулевым до и после inc команда.

Я знаю, что возвращаемое значение AddRef только для целей отладки. AddRef, возвращающий 0, кажется ошибкой. Может ли эта ошибка повлиять на поведение COM-объектов, которые я использую, в частности время жизни?

Если это поможет, я на Win7 64bit внутри VirtualBox, используя MSVS 2010. DLL AddRef находится в: mshtml.dll

mshtml.dll  C:\Windows\SysWOW64\mshtml.dll  Symbols loaded (source information stripped).   C:\SYMBOLS\PUBLIC\mshtml.pdb\049E32F8F9F84F8EB494D8324AC1C3112\mshtml.pdb   104 10.00.9200.16521 (win8_gdr_soc_ie.130216-2100)  10/24/2013 8:37 PM  5D380000-5E137000   [0x21DFC] MyApplication.exe: Native

3

Решение

Это кажется странным, но предположение Алана звучит правдоподобно. Возврат нуля из AddRef не должен влиять на что-либо внутри COM, потому что, как вы упоминаете, значение используется только для отладки.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]