FIX: SEH-Ausnahmen werden von einem falschen Ausnahmehandler abgefangen, wenn die asynchrone Ausnahmebehandlung in WEC 2013 aktiviert ist

In diesem Artikel wird ein Problem beschrieben, bei dem SEH-Ausnahmen von einem falschen Handler in Windows Embedded Compact 2013 abgefangen werden. Ein Update ist verfügbar, um dieses Problem zu beheben. Vor der Installation dieses Updates müssen alle zuvor veröffentlichten Updates für dieses Produkt ebenfalls installiert werden.

Symptome

Nehmen Sie folgendes Szenario an:

  • Sie verwenden das Application Builder-Plug-In für Visual Studio 2013, um eine C++-Anwendung für Windows Embedded Compact 2013 zu erstellen.
  • Sie aktivieren die asynchrone Ausnahmebehandlung mithilfe des Compilerschalters "/EHa". Mit diesem Schalter können sowohl die synchrone als auch die strukturierte Ausnahmebehandlung in C++ (SEH) asynchrone Ausnahmebehandlungsmethoden im selben Code gemischt werden.
  • Sie führen den zugehörigen Code aus, um SEH-Ausnahmen abzufangen.

In diesem Szenario werden SEH-Ausnahmen immer im ersten Ausnahmehandler abgefangen, auch wenn er nach einer synchronen C++-Ausnahme gefiltert wird. 

Das erwartete Verhalten sind SEH-Ausnahmen, die vom Ausnahmehandler mit den Auslassungspunkten abgefangen werden.

Sie führen z. B. den folgenden Beispielcode aus:Klasse CMyEx
{
Öffentlich:
    CMyEx(int nParam) : m_nParam(nParam) { }
    int m_nParam;
};

void TestExceptions()
{
    Versuch
    {
        int a = 42;
        int b = 0;
        auslösen CMyEx(1);
        werfen 97;
        int c = a / b;
    }
    catch (const CMyEx &e)
    {
        wprintf(L"CMyEx exception caught (param=%d)!\n", e.m_nParam);
    }
    Catch (...)
    {
        wprintf(L"Ausnahme des nicht angegebenen Typs, der von der Ellipse-Klausel abgefangen wurde!\n");
    }
} In diesem Beispiel treffen Sie immer die erste catch-Klausel, wenn die SEH-Ausnahme (ganzzahlige Division durch Null) anstelle des Ellipsenhandlers wie erwartet auftritt.

Lösung

Informationen zu Softwareupdates

Das monatliche Windows Embedded Compact 2013-Update (September 2015) ist jetzt bei Microsoft verfügbar. Um dieses monatliche Windows Embedded Compact 2013-Update herunterzuladen, wechseln Sie zu Microsoft OEM Online oder MyOEM.

Voraussetzungen

Dieses Update wird nur unterstützt, wenn alle zuvor veröffentlichten Updates für dieses Produkt ebenfalls installiert wurden.

Neustartanforderung

Nach der Installation dieses Updates müssen Sie die gesamte Plattform neu erstellen. Wenden Sie hierzu eine der folgenden Methoden an:

  • Klicken Sie im Menü Build (Erstellen) auf Clean Solution (Neue Lösung) und dann auf Build Solution (Lösung erstellen).
  • Klicken Sie im Menü Build (Erstellen) auf Rebuild Solution (Lösung neu erstellen).

Sie müssen den Computer nicht neu starten, nachdem Sie dieses Softwareupdate installiert haben.

Ersetzte Updates

Dieses Update ersetzt keine anderen Updates.

Dateiinformationen

Die englische Version dieses Softwareupdatepakets weist die in der nachstehenden Tabelle aufgelisteten Dateiattribute (oder höher) auf. Datums- und Uhrzeitangaben für diese Dateien sind in der koordinierten Weltzeit (UTC) angegeben. Wenn Sie die Dateiinformationen anzeigen, werden sie in die Ortszeit konvertiert. Den Unterschied zwischen UTC- und Ortszeit können Sie in der Systemsteuerung unter Datum und Uhrzeit mithilfe der Angaben auf der Registerkarte Zeitzone ermitteln.

Dateien in diesem Update-Paket

Dateiname Dateigröße Datum Zeit Pfad
Frame.cpp 34,133 13-Nov-2014 01:23:06 Private\Winceos\Coreos\Core\Corelibc\Crtw32\Eh
Fullcrt.lib 30,027,378 09.09.2015 09:17 Public\Common\Oak\Lib\X86\Checked
Fullcrt.lib 30,228,292 09.09.2015 09:17 Public\Common\Oak\Lib\X86\Retail
Fullcrt.lib 28,759,836 09.09.2015 16:09 Public\Common\Oak\Lib\X86\Debug
Fullcrt.lib 29,278,300 09.09.2015 09:17 Public\Common\Oak\Lib\Armv7\Checked
Fullcrt.lib 29,566,730 09.09.2015 09:17 Public\Common\Oak\Lib\Armv7\Retail
Fullcrt.lib 33,139,560 09.09.2015 16:09 Public\Common\Oak\Lib\Armv7\Debug
Msvcr110d.dll 1,339,952 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\X86
Msvcr110.dll 754,224 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\X86
Msvcr110d.map 1,287,579 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\X86
Msvcr110d.rel 528,834 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\X86
Msvcr110.map 788,986 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\X86
Msvcr110.rel 242,169 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\X86
Msvcr110d.dll 1,145,312 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\Arm
Msvcr110.dll 539,608 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\Arm
Msvcr110d.map 2,714,275 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\Arm
Msvcr110d.rel 215,924 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\Arm
Msvcr110.map 1,258,317 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\Arm
Msvcr110.rel 122,167 08.09.2015 05:26 Public\Common\Sdk\Crt\Bin\Arm

      

Referenzmaterial

Informieren Sie sich über die Terminologie, die Microsoft zum Beschreiben von Softwareupdates verwendet.