Bloqueo en CAtlStringMgr :: GetInstance en Windows XP

He escrito una DLL que crea un objeto ATL CString. Lo compilé con Visual Studio 2015 utilizando el conjunto de herramientas de la plataforma "Visual Studio 2015 - Windows XP (v140_xp)". La DLL se carga con LoadLibrary / GetProcAddress.

Se bloquea en Windows XP en CAtlStringMrg :: GetInstance al asignar el objeto de cadena. La misma aplicación funciona bien en Windows Vista y versiones posteriores.

Aquí está el desmontaje:

    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]

Como puede ver, el código hace referencia a __tls_index, por lo tanto, utiliza almacenamiento local de subprocesos. dumpbin también muestra una sección .tls que no está presente cuando compilo mi proyecto con el antiguo Visual Studio 2013.

El almacenamiento local de subprocesos no es compatible con Windows XP cuando una DLL se carga dinámicamente. Esto explica por qué el código anterior se bloquea.

Sin embargo, no pude entender por qué se utiliza el almacenamiento local de subprocesos. No puedo encontrar __declspec (thread) en ninguna parte de las fuentes ATL.

Estoy buscando una solución / solución alternativa (que no sea volver de VS2015 a VS2013).

El problema ya se informó a Microsoft, pero aún no lo comentaron ni lo arreglaron:https://connect.microsoft.com/VisualStudio/feedback/details/1635157/crash-in-catlstringmrg-getinstance-under-windows-xp

Respuestas a la pregunta(1)

Su respuesta a la pregunta