【发布时间】:2010-03-08 19:50:27
【问题描述】:
我有一个 Dllmain,当线程附加到此 DLL 时,它会分配线程本地存储。代码如下:
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
LPVOID lpvData;
BOOL fIgnore;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
onProcessAttachDLL();
// Allocate a TLS index.
if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)
return FALSE;
// how can it jump to next case???
case DLL_THREAD_ATTACH:
// Initialize the TLS index for this thread.
lpvData = (LPVOID) LocalAlloc(LPTR, MAX_BUFFER_SIZE);
if (lpvData != NULL)
fIgnore = TlsSetValue(dwTlsIndex, lpvData);
break;
...
}
我知道根据 Microsoft 文档,对于主线程,没有输入 DLL_THREAD_ATTACH。但是,上面的代码有效。我正在使用VC2005。当我进入调试器时,我看到它进入 DLL_THREAD_ATTACH 后,当 ul_reason_for_call = 1!怎么会这样?如果我在 DLL_PROCESS_ATTACH 块的末尾添加“break”,则 DLL 无法工作。
怎么会这样?
【问题讨论】:
标签: c dll winapi switch-statement