Сбой AddRef при IUnknown (IXRApplication) - PullRequest
0 голосов
/ 21 мая 2018

Я отлаживаю более крупную проблему, но я сузился до определенного сценария.
Сначала:

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

...