您的位置:首页 > 移动开发

关于MFC DLL CWinApp::InitInstance()中创建线程的问题 易造成死锁

2016-05-20 10:12 429 查看
1、创建线程会调用应用程序已经加载的所有DLLDLLMain(参见DLLMain的文档中关于reason参数的说明),而DLLMain是不可以重入的。
2、.exe加载Dll的方法是先调用每一个Dll的InitInstance来初始化需加载的Dll,待所有的Dll都加载成功后,才调用_tWinMain来启动主程序。
3、宿主进程调用LoadLibrary,就可以完成DLL的远程注入。可以通过CreateRemoteThread将LoadLibrary作为宿主进程的一个线程来启动,就可以完成“控制目标进程调用LoadLibrary”的工作。标准DLL中DllMain,是DLL执行的入口;使用MFC的DLL中InitInstance,是DLL执行的入口,但是没有消息循环。a、如果是需要多线程,只能使用有DLLMain的标准DLL。因为使用MFC的DLL,在InitInstance中启动新的线程,会在启动线程的地方阻塞不继续执行。 b、如果需要使用多线程和MFC。可以在标准DLL中先启动线程,再调用使用MFC的DLL。
4、DllApp::InitInstance()在你的DLL的DLLMain中被调用,而你此时又创建线程,就会再次想调用你的DLL的DLLMain,但是DllApp::InitInstance()所在的DLLMain并未执行完。所以就得等待完成,所以就AfxbeginThread等待自己完成操作,卡在这里了。采用 handleThd = ::CreateThread(NULL,0,_RecvProc,(LPVOID)this,0,NULL); 会执行,具体有待探究。大家一起探讨。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: