Добрый день. Есть необходимость поработать с thread local storage в DLL, которая реализует callback-функции для стороннего приложения. Взял пример из MSDN:
// The DLL code
#include <windows.h>
static DWORD dwTlsIndex; // address of shared memory
// DllMain() is the entry-point function for this DLL.
BOOL WINAPI DllMain(HINSTANCE hinstDLL, // DLL module handle
DWORD fdwReason, // reason called
LPVOID lpvReserved) // reserved
{
LPVOID lpvData;
BOOL fIgnore;
switch (fdwReason)
{
// The DLL is loading due to process
// initialization or a call to LoadLibrary.
case DLL_PROCESS_ATTACH:
// Allocate a TLS index.
if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)
return FALSE;
// No break: Initialize the index for first thread.
// The attached process creates a new thread.
case DLL_THREAD_ATTACH:
// Initialize the TLS index for this thread.
lpvData = (LPVOID) LocalAlloc(LPTR, 256);
if (lpvData != NULL)
fIgnore = TlsSetValue(dwTlsIndex, lpvData);
break;
// И так далее...
Так вот, при первом вызове из потока ф-ция TlsGetValue(dwTlsIndex) всегда возвращает NULL. Если снова вызвать TlsSetValue (уже в теле потока), то все начинает работать нормально. Другими словами — куда пропал указатель lpvData, изначально сохраненный в функции DLLMain? Или так и должно быть? Или я где-то туплю?
Заранее спасибо за ответы.