КОРЕКЦИЯ: Изключенията на SEH се прихващат от грешен манипулатор на изключения, когато асинхронната обработка на изключения е разрешена в WEC 2013

Тази статия описва проблем, при който изключения на SEH са уловени от грешен манипулатор в Windows Embedded Compact 2013. Налична е актуализация, която да коригира този проблем. Преди да инсталирате тази актуализация, всички предишни актуализации за този продукт трябва да бъдат инсталирани.

Симптоми

Имайте предвид сценария, описан по-долу:

  • Можете да използвате добавката Application Builder за Visual Studio 2013, за да създадете приложение на C++, което е предназначено за Windows Embedded Compact 2013.
  • Асинхронното обработване на изключения се разрешава с помощта на компилатора "/EHa". Този ключ позволява както C++ синхронно и структурирано обработване на изключения (SEH) асинхронни методи за обработка на изключения да се смесват в един и същ код.
  • Изпълнявате съответния код, за да откриете изключения на SEH.

В този случай изключенията на SEH винаги се хващат в първия манипулатор на изключения, дори ако той е филтриран за C++ синхронно изключение. 

Очакваното поведение е SEH изключения, които се прихващат от манипулатора за изключения на многоточие.

Например изпълнявате следния примерен код:class CMyEx
{
Публични:
    CMyEx(int nParam) : m_nParam(nParam) { }
    int m_nParam;
};

void TestExceptions()
{
    опитате
    {
        int a = 42;
        int b = 0;
        хвърляне CMyEx(1);
        хвърляне 97;
        int c = a / b;
    }
    улов (конст CMyEx &e)
    {
        wprintf(L"CMyEx exception caught (param=%d)!\n", e.m_nParam);
    }
    улов (...)
    {
        wprintf(L"Изключение от неопределен тип, схванат от многоточие клауза!\n");
    }
} В тази извадка винаги попадате в първата клауза catch, когато възникне изключение SEH (цяло число делено на нула) вместо манипулатора за многоточие, както се очакваше.

Решение

Информация за актуализацията на софтуера

Месечната актуализация на Windows Embedded Compact 2013 (септември 2015 г.) вече се предлага от Microsoft. За да изтеглите тази месечна актуализация за Windows Embedded Compact 2013, отидете на Microsoft OEM Online или MyOEM.

Предварителни изисквания

Тази актуализация се поддържа само ако са инсталирани и всички предишни издадени актуализации за този продукт.

Изискване за рестартиране

След като приложите тази актуализация, трябва да извършите чисто компилация на цялата платформа. За да направите това, използвайте един от следните методи:

  • В менюто "Компилация " изберете "Изчистване на решението" и след това изберете "Компилация на решение".
  • В менюто "Компилация " изберете "Повторно създаване на решение".

Не е необходимо да рестартирате компютъра си, след като приложите тази актуализация на софтуера.

Информация за заместване на актуализация

Тази актуализация не замества други актуализации.

Информация за файла

Файловите атрибути на английската версия на този пакет за актуализация на софтуера (или по-нови) са посочени в следната таблица. Датите и часовете за тези файлове са изброени в координирано световно време (UTC). Информацията за файла се преобразува в местно време при преглед. За да определите разликата между UTC и локалното време, отворете раздела "Часова зона" в "Дата и час" на Контролен панел.

Files, които са включени в този пакет за актуализация

Име на файл Размер на файл Дата Час Път
Frame.cpp 34,133 13 ноември 2014 г. 23:06 Private\Winceos\Coreos\Core\Corelibc\Crtw32\Eh
Fullcrt.lib 30,027,378 09 септември 2015 г. 09:17 Public\Common\Oak\Lib\x86\Checked
Fullcrt.lib 30,228,292 09 септември 2015 г. 09:17 Public\Common\Oak\Lib\X86\Retail
Fullcrt.lib 28,759,836 09 септември 2015 г. 09:16 Public\Common\Oak\Lib\X86\Debug
Fullcrt.lib 29,278,300 09 септември 2015 г. 09:17 Public\Common\Oak\Lib\armv7\Checked
Fullcrt.lib 29,566,730 09 септември 2015 г. 09:17 Public\Common\Oak\Lib\armv7\Retail
Fullcrt.lib 33,139,560 09 септември 2015 г. 09:16 Public\Common\Oak\Lib\Armv7\Debug
Msvcr110d.dll 1,339,952 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\X86
Msvcr110.dll 754,224 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\X86
msvcr110d.map 1,287,579 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\X86
msvcr110d.rel 528,834 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\X86
msvcr110.map 788,986 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\X86
msvcr110.rel 242,169 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\X86
Msvcr110d.dll 1,145,312 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\Arm
Msvcr110.dll 539,608 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\Arm
msvcr110d.map 2,714,275 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\Arm
msvcr110d.rel 215,924 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\Arm
msvcr110.map 1,258,317 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\Arm
msvcr110.rel 122,167 08 септември 2015 г. 05:26 Public\Common\Sdk\Crt\Bin\Arm

      

Справки

Научете повече относно терминологията, която Microsoft използва за описване на актуализациите на софтуера.