我正在调试一个更大的问题,但我已经缩小到特定情况 首先:
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
之后,任何呼叫都会崩溃。好像AddRef()
实际上正在摧毁对象。崩溃似乎是一个空引用异常。
编辑:
因此,在学习了如何在WEC7仿真器上进行调试后,我发现了问题。 IUnknown
上xor 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的规则。我很难理解他们如何发布破坏堆栈的代码。