如下代码,DLL_PROCESS_ATTACH中创建一个线程,试图在DLL_PROCESS_DETACH中设置结束标记并等待线程结束,程序会死在这里。没有仔细跟踪汇编代码,估计线程结束的时候会进入到DLL_THREAD_DETACH中,但此时DLL进程空间已经没有合适的代码去执行了,所以就挂了。
比较隐蔽的情况是把线程作为一个类的成员来实现。类的构造函数在DLL加载的时候创建进程,在DLL_PROCESS_DETACH中delete类,析构的时候就挂掉了。类似的层层包裹使得分析错误原因很麻烦,还是小心避免。
还有一种情况是加载DLL的进程退出的时候,被创建的DLL在DLL_PROCESS_DETACH中也可以被系统回收,所以不会死在这里。不过还是不要太信赖操作系统,不符合C/C++程序员的坏习惯。