我有一个Dllmain分配线程本地存储当一个线程连接到此DLL。代码如下:开关/案件没有中断DllMain
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;
...
}
我知道,主线程中,DLL_THREAD_ATTACH未输入,按照微软的文档。但是,上面的代码工作。我正在使用VC2005。当我进入调试器时,我看到在它进入DLL_THREAD_ATTACH的情况下,当ul_reason_for_call = 1!这怎么可能发生?如果我在DLL_PROCESS_ATTACH块的末尾添加了“break”,则DLL无法工作。
这是怎么发生的?
感谢。虽然我有多年的C/C++经验,但我从来没有写过这样的结论。我总是在每个分支或多个案例中分摊(共享相同的代码块)。第一次看起来很奇怪。 – cuteCAT 2010-03-08 20:03:34
@Sherwood Hu - 是的,乍看起来很奇怪:-)我意识到我的措辞可能让你觉得有辱人格,所以我重新编写了它。现在您对您的问题得到了满意的答案,请问您是否符合SO常规?谢谢。 – 2010-03-08 20:21:59
更好的做法是将'DLL_THREAD_ATTACH'代码放在它自己的函数中,并从'DLL_PROCESS_ATTACH'和'DLL_THREAD_ATTACH'中调用它,同时添加“missing”'break' – 2016-06-20 09:40:38