为什么AddRef返回零
Why AddRef returns zero
我正在调试C /com应用程序,查看我们如何添加rref和发布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 = %lun", a_msg.c_str(), pUnk, count);
return count;
}
朋克实际上是iwebbrowser2 com接口到Web控件:
pUnk 0x20d763ac IUnknown *
__vfptr 0x5d85b0d8 const CFrameWebOC::`vftable'{for `IWebBrowser2'}
我已经研究了该行的拆卸(调试构建模式):
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
在行6515A543
上为0。
在我进入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对象的行为,特别是终生?
如果有帮助,我使用MSVS 2010在VirtualBox内部使用Win7 64位。DLL ADDREF在:mshtml.dll
mshtml.dll C:WindowsSysWOW64mshtml.dll Symbols loaded (source information stripped). C:SYMBOLSPUBLICmshtml.pdb 49E32F8F9F84F8EB494D8324AC1C3112mshtml.pdb 104 10.00.9200.16521 (win8_gdr_soc_ie.130216-2100) 10/24/2013 8:37 PM 5D380000-5E137000 [0x21DFC] MyApplication.exe: Native
看起来确实很奇怪,但是艾伦的猜测听起来很正确。从addRef返回零不应影响com中的任何内容,因为您提到的值仅用于调试。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 如果从函数返回指向指针 COM 对象的指针,我是否需要 AddRef()?
- 为什么AddRef返回零