0

Thread Local Storage について学んでいます... (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 を入れました....何が間違っていたのでしょうか?

4

2 に答える 2

1

いくつかのメモ:

エラー チェック ステートメントは次のようになります。

(g_dwTLSIndex == TLS_OUT_OF_INDEXES) の場合。

現状では、g_dwTlsIndex を 2 回割り当てています (したがって、最初の割り当てで参照が失われます)。

基本的なデバッグを行います。

  1. TlsSetValue の直後の行で TlsGetValue を呼び出します。それは少なくとも機能しますか?
  2. 戻りコードを確認してください。TlsGetValue と TlsSetValue はどちらも、割り当てが成功したかどうかを示す関数を返します。でしたか?
  3. インデックスを追跡します。g_dwTlsIndex を格納するためにグローバル変数を使用しているため、簡単に変更される可能性があります。割り当て後の値は何ですか (printf を使用して確認してください)。Get 呼び出しを行ったときの値は? これらの値は一致していますか?

これらの手順は、問題を見つけるのに役立ちます。

于 2010-06-20T19:28:40.170 に答える
0

私はそれvalがローカルだとDllMain思いますか?

どのバージョンのWindowsを実行していますか?64ビットWindowsには64ビットポインタと32ビットintがあるため、すべてのmemcpy呼び出しが正しくありません。を使用するのではなくmemcpy、値を直接キャストするだけです。

TlsSetValue(g_dwTLSIndex,(LPVOID)5);
int data=(int)TlsGetValue(g_dwTLSIndex);
于 2010-09-24T06:43:34.537 に答える