C ++ TLS, что-то не так - PullRequest
0 голосов
/ 20 июня 2010

Я узнаю о потоке локального хранилища ... (TLS) Вот мой код TLS Alloc:

//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 ... Что я сделал не так?

Ответы [ 2 ]

1 голос
/ 20 июня 2010

Несколько заметок:

Ваше заявление о проверке ошибок должно выглядеть следующим образом:

if (g_dwTLSIndex == TLS_OUT_OF_INDEXES).

В нынешнем виде вы назначаете g_dwTlsIndex дважды (и, таким образом, теряете ссылку при первом назначении.)

Выполнить базовую отладку:

  1. Вызвать TlsGetValue в строке сразу после TlsSetValue. Это работает по крайней мере?
  2. Проверьте коды возврата. TlsGetValue и TlsSetValue возвращают функцию, сообщающую, было ли назначение успешным. Это было?
  3. Следите за своим индексом. Вы используете глобальную переменную для хранения g_dwTlsIndex, поэтому ее легко можно изменить. Каково значение после alloc (используйте printf, чтобы увидеть). Каково значение при выполнении вызова Get? Эти значения совпадают?

Эти шаги должны помочь вам найти проблему.

0 голосов
/ 24 сентября 2010

Я предполагаю, что val локально для DllMain?

В какой версии Windows вы работаете?В 64-битной Windows есть 64-битные указатели и 32-битные int, поэтому все вызовы memcpy будут некорректными.Вместо использования memcpy просто приведите значения напрямую:

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