0

我正在调试一个更大的问题,但我已经缩小到一个特定的场景。
首先:

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->ReleasepUnk->QueryInterface它崩溃。如果我在它运行pUnk->Release之前调用但在任何调用崩溃后再次调用。看起来好像实际上是在破坏对象。崩溃似乎是一个空引用异常。 pUnk-AddRefpUnk->AddRefAddRef

编辑:

因此,在学习了如何在 WEC7 模拟器上进行调试后,我发现了问题所在。AddRef()上的组件IUnknown看起来像这样

xor eax, eax
retn 0x0C

就是这样,所以每次调用都会AddRef()破坏堆栈。这很有趣,因为有时它会起作用,而其他时候则不会,但事实证明它与堆栈有关,即堆栈分配的变量。

我现在不知道如何工作。由于可移植性问题,我试图避免使用本机包装器,但我认为仅使用托管代码无法解决此问题。

另一方面,微软到底在想什么。这不违反COM自己的规则吗?我很难理解他们如何发布破坏堆栈的代码。

4

0 回答 0