2010-06-20 19 views
0

我瞭解線程本地存儲...(TLS) 這裏是我的TLS的Alloc代碼:C++ TLS,有些事情錯了

//global variable 
DWORD g_dwTlsIndex; 

//inside DLLMain: 
int val= 5; 
switch (ul_reason_for_call) 
{ 
case DLL_PROCESS_ATTACH: 
    g_dwTlsIndex = TlsAlloc(); 

    if ((g_dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) 
    { 
    printf("No more indexes available"); 
    } 

    void *pint; 
    memcpy(&pint, &val, sizeof val); 

    TlsSetValue(g_dwTlsIndex, pint); 
    break; 

現在我試圖讓從TLS值:(在另一個CPP文件)

// declare index value... 
extern DWORD g_dwTlsIndex; 

    int data; 
LPVOID d; 
d = TlsGetValue(g_dwTlsIndex); 
memcpy(&data, &d, sizeof d); 

printf("Data: %d", data); 

但數據包含0,其中我把5放在它....我做了什麼錯了?

回答

1

的幾個注意事項:

你的錯誤檢查的語句應該是:

如果(g_dwTLSIndex == TLS_OUT_OF_INDEXES)。

既然這樣,你要指定g_dwTlsIndex兩次(因而失去了與第一分配的參考。)

做一些基本的調試:TlsSetValue後

  1. 調用TlsGetValue在該行immiediately。這至少起作用嗎?
  2. 檢查退貨代碼。 TlsGetValue和TlsSetValue都返回一個函數,告訴你賦值是否成功。是嗎?
  3. 跟蹤您的索引。你正在使用一個全局變量來存儲g_dwTlsIndex,所以它很容易被改變。 alloc後的值是什麼(使用printf來查看)。您撥打獲取電話時的價值是什麼?這些值是否匹配?

這些步驟應該可以幫助您找到問題。

0

我認爲valDllMain的本地?

你運行的是哪個版本的Windows? 64位Windows具有64位指針和32位int,因此所有memcpy調用都將不正確。而不是使用memcpy,只需直接施加數值:

TlsSetValue(g_dwTLSIndex,(LPVOID)5); 
int data=(int)TlsGetValue(g_dwTLSIndex);