Сбой 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. Мне трудно понять, как они могут выпустить код, который так портит стек.

0 ответов

Другие вопросы по тегам