我正在调试一个更大的问题,但我已经缩小到一个特定的场景。
首先:
XamlRuntimeInitialize();
IXRApplication* pApp;
res=GetXRApplicationInstance(&pApp);
这工作正常,然后:
IUnknown* pUnk;
res=pApp->QueryInterface(IID_IUnknown, (void**)&pUnk);
这会执行甚至返回,S_OK
但是返回的地址与返回的地址pUnk
不同pApp
(正好少 4 个字节),出乎意料但技术上不是问题
在那之后:
UINT cnt=pUnk->AddRef();
这将执行并返回 0 但从此时开始,如果我尝试调用pUnk->Release
或pUnk->QueryInterface
它崩溃。如果我在它运行pUnk->Release
之前调用但在任何调用崩溃后再次调用。看起来好像实际上是在破坏对象。崩溃似乎是一个空引用异常。 pUnk-AddRef
pUnk->AddRef
AddRef
编辑:
因此,在学习了如何在 WEC7 模拟器上进行调试后,我发现了问题所在。AddRef()
上的组件IUnknown
看起来像这样
xor eax, eax
retn 0x0C
就是这样,所以每次调用都会AddRef()
破坏堆栈。这很有趣,因为有时它会起作用,而其他时候则不会,但事实证明它与堆栈有关,即堆栈分配的变量。
我现在不知道如何工作。由于可移植性问题,我试图避免使用本机包装器,但我认为仅使用托管代码无法解决此问题。
另一方面,微软到底在想什么。这不违反COM自己的规则吗?我很难理解他们如何发布破坏堆栈的代码。