gpt4 book ai didi

c - DllMain 中没有中断的开关/大小写

转载 作者:太空宇宙 更新时间:2023-11-04 05:15:35 27 4
gpt4 key购买 nike

我有一个 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;
...

我知道对于主线程,没有输入 DLL_THREAD_ATTACH,根据 Microsoft 文档。但是,上面的代码有效。我正在使用 VC2005。当我进入调试器时,我看到当ul_reason_for_call = 1 时,它进入DLL_THREAD_ATTACH case 之后!怎么会这样?如果我在 DLL_PROCESS_ATTACH block 的末尾添加“break”,DLL 将无法工作。

这怎么会发生?

最佳答案

如果我没理解错的话,您想知道为什么在输入 DLL_PROCESS_ATTACH 之后情况下,执行继续在 DLL_THREAD_ATTACH case,而不是在switch结束之后.

这种行为称为“失败”,它是标准 C。没有明确的 break语句,执行在下一个 case 继续.

当然,对于第一次看到它的程序员来说,这是相当违反直觉的,因此它一直是误解甚至错误的来源(您可能并不总是知道 break 是有意遗漏还是错误遗漏) .因此,在使用此构造时,使用注释明确标记它是一种很好的做法,例如:

switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
onProcessAttachDLL();
// Allocate a TLS index.
if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)
return FALSE;
// fall through
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;
...

关于c - DllMain 中没有中断的开关/大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2404241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com