Исключение в DLL из-за __declspec(thread)

Dima T
Дата: 07.12.2014 21:21:05
VC2008. Создаю новый проект Win32 DLL, пара строк кода.
+ Исходник DLL

test.h
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif

extern "C" TEST_API int fntest(void);

test.cpp
#include "stdafx.h"
#include <windows.h>
#include "test.h"

__declspec(thread) char t[10];
//char t[10];

TEST_API int fntest(void)
{
	int ret;
	__try {
		ret = t[0];
	} __except(EXCEPTION_EXECUTE_HANDLER) {
		ret = 256;
	}
	return ret;
}


Вызываю из Visual Foxpro
declare integer fntest in test.dll
? fntest()

Происходит исключение, получаю 256.
убираю __declspec(thread) - работает, получаю 0.

Из самодельного EXE все работает.

Так понимаю в вызывающем процессе чего-то нехватает, но чего? можно как-то полечить? Иначе много чего переписать придется чтобы избавиться от __declspec(thread)
MasterZiv
Дата: 07.12.2014 21:50:56
Dima T,

Наверное
http://msdn.microsoft.com/ru-ru/library/2s9wt68x.aspx
, последний пункт.
Dima T
Дата: 08.12.2014 09:30:14
Спасибо. Почитал, мой случай, в Win7 работает, в XP не хочет :(

Избавился от __declspec(thread), хорошо что переменных таких немного. Чтобы логику не ломать, заменил на <map> с GetCurrentThreadId() в индексе.
MasterZiv
Дата: 08.12.2014 11:34:48
Dima T,

ну я как говориться пальцем в небо ...
MasterZiv
Дата: 08.12.2014 11:44:17
Dima T
Спасибо. Почитал, мой случай, в Win7 работает, в XP не хочет :(

Избавился от __declspec(thread), хорошо что переменных таких немного. Чтобы логику не ломать, заменил на <map> с GetCurrentThreadId() в индексе.



не забудь синхронизировать доступ к карте.