IUnknown(IXRApplication)崩溃时的AddRef

时间:2018-05-21 18:52:48

标签: com windows-embedded-compact iunknown silverlight-embedded

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

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-AddRef之前调用它pUnk->AddRef,那么在AddRef之后,任何呼叫都会崩溃。好像AddRef()实际上正在摧毁对象。崩溃似乎是一个空引用异常。

编辑:

因此,在学习了如何在WEC7仿真器上进行调试后,我发现了问题。 IUnknownxor eax, eax retn 0x0C 的汇编看起来像这样

AddRef()

多数,所以每次调用 <script> var list = document.getElementById('valueList'); var listItem = ''; var count = 0; @for (int i = 0; i<stp.Value.Count; i++) { <text> listItem += '<ul><li><a href="#">' + '@stp.Value[i]' + '</a>' count = i; </text> } for (var i = 0; i <=count; i++) { listItem += '</li></ul>' } list.innerHTML = listItem; </script> 都会破坏堆栈。它很有意思,因为有时它会工作,有时候不会,但事实证明它更多地与堆栈有关,即堆栈分配的变量。

我现在不知道如何解决这个问题。我试图避免使用本机包装器,因为可移植性问题,但我不认为有任何方法可以解决托管代码问题。

另一方面,微软的想法是什么。这是否违反了COM的规则。我很难理解他们如何发布破坏堆栈的代码。

0 个答案:

没有答案