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