能力值:
( LV2,RANK:10 )
|
-
-
2 楼
补充说明下:
这不是作为Svchost服务启动的DLL,没有ServiceMain。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
DllMain返回前新建的线程都会被
RtlEnterCriticalSection(&ntdll.LdrpLoaderLock);
阻塞
你不去Wait新建的线程就好了
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
DllMain和多线程死锁
http://www.cnblogs.com/zhangdongsheng/archive/2012/06/12/2545744.html
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
创建的两个工作线程都是带有while(1)的,需要处理网络连接,不使用WaitXXXX函数不好使也。
|
能力值:
( LV4,RANK:55 )
|
-
-
6 楼
我也遇到同样的问题
dllmain中创建线程,没有wait
但是照样死锁了
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
刚刚测试了下,单线程貌似没有问题,但是需要创建两个工作线程啊,在线程中再创建线程。这代码就没辙了。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
共勉吧
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
试试这个,看看行吗?
LdrUnlockLoaderLock(1,(GetCurrentThreadId() & 0xfff)<<16);
LdrUnlockLoaderLock链接到ntdll.lib
|
能力值:
(RANK:20 )
|
-
-
10 楼
DllMain()中不要干复杂的事情,因为持有loader锁时干复杂事情很容易死锁。
可以让dll导出一对Init()/CleanUp()的函数,用于做全局初始化(比如创建线程)、全局清理(比如等待线程退出,不等待线程退出就会非法操作)。
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
不做线程等待就可以了啊
创建了线程就关闭句柄,或者在dll卸载的时候关闭句柄
|
能力值:
(RANK:20 )
|
-
-
12 楼
在DLL中创建的线程,必须在DLL unload之前等待其退出,不然线程体对应的代码区域被unload了,就崩了
|
能力值:
( LV5,RANK:60 )
|
-
-
13 楼
创建一个时钟不知道可以不,然后再在时钟里创建线程,并停掉时钟~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
同楼主一样,求解!!!!
|
能力值:
( LV3,RANK:30 )
|
-
-
15 楼
如果是MFC中的话,使用C++库函数_beginthread ()、_beginthreadEx (),不要使用MFC的线程函数就行了
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
jackZhan
同楼主一样,求解!!!!
如果你的线程是即时退出,那你可以wait,如果不能,那就不要在DLL_PROCESS_ATTACH里面wait线程,DLL_PROCESS_ATTACH创建的线程不会调用DLL_THREAD_ATTACH,另外,线程一般无需回收,因为回收也没用,当程序卸载dll的时候,系统会帮你把所有的在dll中创建的线程都关闭,所以即使你在DLL_PROCESS_DETACH里面去回收线程也是没用的,系统在调用DLL_PROCESS_DETACH之前就已经把线程回收了,所以说不建议在DLL_PROCESS_ATTACH里面创建线程,如果创建,那就要好好设计你的线程不要造成死锁和内存泄漏,一般情况下需要写一个接口来做释放,但在dll注入,劫持等情况下只能在DllMain中创建线程,此时就需要多加小心,以免造成程序崩溃或者无响应
|
|
|