Сбой в CAtlStringMgr :: GetInstance под Windows XP

Я написал DLL, которая создает объект ATl CString. Я компилирую его с помощью Visual Studio 2015, используя набор инструментов платформы «Visual Studio 2015 - Windows XP (v140_xp)». DLL загружается с использованием LoadLibrary / GetProcAddress.

Сбой в Windows XP в CAtlStringMrg :: GetInstance при выделении строкового объекта. Это же приложение хорошо работает в Windows Vista и более поздних версиях.

Вот разборка:

    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]

Как видите, код ссылается на __tls_index, поэтому он использует локальное хранилище потоков. На dumpbin также отображается раздел .tls, которого нет при компиляции моего проекта со старой Visual Studio 2013.

Локальное хранилище потоков не поддерживается в Windows XP, когда DLL загружается динамически. Это объясняет, почему код выше вылетает.

Однако я не мог понять, почему используется локальное хранилище потоков. Я не могу найти __declspec (поток) в источниках ATL.

Я ищу исправление / обходной путь (кроме возврата от VS2015 к VS2013).

О проблеме уже сообщили в Microsoft, но они еще не комментировали / исправляли ее:https://connect.microsoft.com/VisualStudio/feedback/details/1635157/crash-in-catlstringmrg-getinstance-under-windows-xp

Ответы на вопрос(1)

Ваш ответ на вопрос