Crash in CAtlStringMgr :: GetInstance unter Windows XP

Ich habe eine DLL geschrieben, die ein ATL-CString-Objekt erstellt. Ich kompiliere es mit Visual Studio 2015 mit dem Plattform-Toolset "Visual Studio 2015 - Windows XP (v140_xp)". Die DLL wird mit LoadLibrary / GetProcAddress geladen.

Es stürzt unter Windows XP in CAtlStringMrg :: GetInstance ab, wenn das Zeichenfolgenobjekt zugewiesen wird. Dieselbe Anwendung funktioniert auch unter Windows Vista und höher.

Hier ist die Demontage:

    static IAtlStringMgr* GetInstance()
    {
#pragma warning(push)
#pragma warning(disable: 4640)
        static CWin32Heap strHeap( ::GetProcessHeap() );
1003B100 mov         eax,dword ptr fs:[0000002Ch] 
1003B106 mov         ecx,dword ptr [__tls_index (101B46C8h)] 
1003B10C push        esi 

*** This is the instruction that causes the crash. eax and ecx are zero. ***
1003B10D mov         esi,dword ptr [eax+ecx*4]

Wie Sie die Codereferenzen __tls_index sehen können, verwendet es Thread-lokalen Speicher. dumpbin zeigt auch einen .tls-Abschnitt an, der nicht vorhanden ist, wenn ich mein Projekt mit dem alten Visual Studio 2013 kompiliere.

er lokale Speicher von @Thread wird unter Windows XP nicht unterstützt, wenn eine DLL dynamisch geladen wird. Dies erklärt, warum der obige Code abstürzt.

Ich konnte jedoch nicht herausfinden, warum Thread-lokaler Speicher verwendet wird. Ich kann __declspec (thread) nirgendwo in den ATL-Quellen finden.

Ich suche nach einem Fix / einer Problemumgehung (außer von VS2015 zu VS2013 zurückzukehren).

Das Problem wurde bereits an Microsoft gemeldet, aber noch nicht kommentiert / behoben:https: //connect.microsoft.com/VisualStudio/feedback/details/1635157/crash-in-catlstringmrg-getinstance-under-windows-x

Antworten auf die Frage(2)

Ihre Antwort auf die Frage