tlssetvalue не сохраняет значение
От: Vitas1  
Дата: 08.06.11 08:47
Оценка:
Добрый день. Есть необходимость поработать с 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? Или так и должно быть? Или я где-то туплю?
Заранее спасибо за ответы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.