请都高手,关于线程与DLL问题
在DLL的DLL_PROCESS_ATTACH 中 CreateThread建立线程,线程不作用。
单步跟踪时CreateThread调用成功,VS2005线程调试中没有目标线程,目标线程中断点也没有断到。NtCreateThread被成功调用,GetExitCodeThread显示线程运行中。
问题1:是不是要DLL完成载入后线程才会被创建?!
DWORD CMThreadLog::WriteLogProc(LPVOID lpParameter)
{
HANDLE hFile;
TCHAR strFile[255];
DWORD dWritten;
MSG msg;
if (!GetModuleFileName(GetModuleHandle(NULL),strFile,sizeof(strFile)-5*sizeof(TCHAR)))
return -1;
lstrcat(strFile, ".log ");
hFile = CreateFile(strFile,FILE_WRITE_DATA,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,(LPVOID)_T( "LogStart\r\n "),(DWORD)10,&dWritten,NULL);
PeekMessage(&msg, NULL, WM_USER, WM_USER+1, PM_NOREMOVE);
ReleaseSemaphore(hSema,1,NULL);
while(true)
{
if (GetMessage(&msg,NULL,WM_USER, WM_USER))
{
WriteFile(hFile,(LPVOID)msg.wParam,(DWORD)msg.lParam,&dWritten,NULL);
ReleaseSemaphore(hSema,1,NULL);
}
//WaitMessage();
}
WriteFile(hFile,(LPVOID)_T( "LogEND\r\n "),(DWORD)8,&dWritten,NULL);
ReleaseSemaphore(hSema,1,NULL);
CloseHandle(hFile);
return 0;
}
线程正常运行后,会自动退出,运行不到消息循环外的代码(信号量不考虑也一样)
问题2:什么原因会导致线程非正常退出?所有代码中都未(显式)调用ExitThread TerminateThread,本来退出线程是通过特定消息的
[解决办法]
mark
[解决办法]
DLLMain里面不能CreateThread,很严重的错误。
DllMain是Serialize执行的,在DLLMain结束以前,DLL_ATTACH_THREAD没法被叫到,这样DLLMain的机制就破坏了。当然最严重的还是死锁问题。
我同事Mike Grier写过一篇Blog专门讲DLL加载内幕的,他原来是负责NT DLL Loader的,应该是最有权威的,推荐大家看看,比如这篇讲到DllMain里面CreateThread的问题:
http://blogs.msdn.com/mgrier/archive/2005/06/21/431378.aspx