调用IXRApplication对应IUnknown的AddRef时崩溃问题排查
COM对象AddRef调用引发栈损坏及崩溃问题排查
我正在调试一个复杂的COM相关问题,目前已将问题范围缩小至以下特定场景:
- 执行以下代码时运行完全正常:
XamlRuntimeInitialize(); IXRApplication* pApp; res=GetXRApplicationInstance(&pApp); - 调用
QueryInterface获取IUnknown接口:
该调用返回IUnknown* pUnk; res=pApp->QueryInterface(IID_IUnknown, (void**)&pUnk);S_OK,但pUnk的地址比pApp小4字节——虽不符合预期,但当时未引发直接问题。 - 调用
AddRef方法:
此调用返回0,后续调用UINT cnt=pUnk->AddRef();pUnk->Release或pUnk->QueryInterface均会崩溃;即使先调用Release再调用AddRef,后续操作仍会崩溃,疑似AddRef直接销毁了对象,崩溃类型为空引用异常。
补充调试结果:
在WEC7模拟器中调试后找到了问题根源:这个IUnknown的AddRef函数汇编代码如下:
xor eax, eax retn 0x0C
这段代码会直接导致栈损坏,之前偶尔能运行完全是受栈上分配的其他变量影响。目前因可移植性需求,我想避免使用原生封装方案,但纯托管代码似乎无法解决该问题,实在疑惑微软为何会做出这种违反COM规范的实现。
内容的提问来源于stack exchange,提问作者MDK
相关产品推荐
相关产品推荐

