Сбой в 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