关于MFC DLL CWinApp::InitInstance()中创建线程的问题 易造成死锁
2016-05-20 10:12
429 查看
1、创建线程会调用应用程序已经加载的所有DLL的DLLMain(参见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); 会执行,具体有待探究。大家一起探讨。
相关文章推荐
- Swift-闭包
- 在Android Studio中使用Lambda表达式
- 更改App显示名称
- Swift-集合类型
- Swift-函数
- 给大家分享下仿QQ消息页面横向滑出菜单,Item内容较多的情况
- Swift-字符串和字符
- 使用Object-C实现23种设计模式之抽象工厂模式
- 【android】:android与java的关系
- Android在线自动更新的实现
- Execution failed for task ':app:mergeDebugResources'. > Some file crunching
- Swift-基本运算符
- iOS APP安全杂谈
- ios中的字符串等的拼接+for循环实例
- Object 体系结构常用方法
- Android图片压缩(质量压缩和尺寸压缩)
- unity AssetBundle 使用方法1
- 关于listview的onitem方法点击无效
- 手把手教你写框架之ShykyAnnotations - 开头篇
- unity AssetBundle 使用方法2