스레드가이 DLL에 연결될 때 스레드 로컬 저장소를 할당하는 Dllmain이 있습니다. 아래 코드 :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를 사용하고 있습니다. 디버거를 입력했을 때 ul_reason_for_call = 1 일 때 DLL_THREAD_ATTACH가 입력 된 것을 보았습니다! 어떻게 그럴 수 있습니까? DLL_PROCESS_ATTACH 블록 끝에`break '를 추가하면 DLL이 작동하지 않습니다.
어떻게 이런 일이 발생할 수 있습니까?
감사합니다. 저는 C/C++로 다년간의 경험을 쌓았지만, 그런 construt을 쓰지 않았습니다. 나는 항상 각 분기 또는 여러 사례 (동일한 코드 블록 공유)에 휴식 시간을 넣습니다. 처음에는 이상하게 보입니다. – cuteCAT
@Sherwood Hu - 예, 이상하게 보입니다 :-) 나는 내 말씨가 당신에게 타락한 것처럼 느껴졌을 것이라고 생각했다. 질문에 대한 만족스러운 답변을 얻었으니 SO 협약에 따라 동의 해 줄 것을 요청할 수 있습니까? 감사. –
"DLL_THREAD_ATTACH"코드를 자신의 함수에 넣고'DLL_PROCESS_ATTACH'와'DLL_THREAD_ATTACH' 둘 다에서 호출하는 한편, "missing"'break' –