首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

请都高手,关于线程与DLL有关问题

2012-01-18 
请都高手,关于线程与DLL问题在DLL的DLL_PROCESS_ATTACH中CreateThread建立线程,线程不作用。单步跟踪时Crea

请都高手,关于线程与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

热点排行