Сбой AddRef при IUnknown(IXRApplication)
Я отлаживаю более крупную проблему, но я сузился до определенного сценария.
Во-первых:
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()
портит стек Это интересно, потому что иногда это будет работать, а иногда нет, но оказывается, что это больше связано со стеком, то есть с переменными, выделенными стеком.
Я понятия не имею, как работать это сейчас. Я пытаюсь избежать встроенной оболочки из-за проблем переносимости, но я не думаю, что есть какой-либо способ обойти это с помощью только управляемого кода.
На другой ноте, что, черт возьми, думала Microsoft. Разве это не нарушает собственные правила COM. Мне трудно понять, как они могут выпустить код, который так портит стек.