Если я правильно вас понимаю, вас интересует, почему после ввода случая DLL_PROCESS_ATTACH
выполнение продолжается для случая DLL_THREAD_ATTACH
, а не после окончания 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;
...