acneyang 2023-01-31 16:09 采纳率: 100%
浏览 68
已结题

VC中在CWinApp::initinstance报未经处理的异常,加载dll报Debug Assertion!

VC++,在CWinApp::initinstance中(INT_PTR nResponse = dlg.DoModal()这句上中断),时不时报错0x771160D7 (ntdll.dll) (hrSync.exe 中)处有未经处理的异常: 0xC000041D: 用户回调期间遇到未经处理的异常。
有时能正常运行,有时会报这个错,找不到规律,要崩溃了

另外,加载动态库,在LoadLibrary这句上,
try
{
hdll = LoadLibrary(plugPathList[i]) ;
}

会报这样的错,也是找不到原因
Debug Assertion Failed!
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\atl\atls\atldebugapi.cpp
Line: 50
Expression: pModule != 0

之前还好好的,后来写着写着,不知道改哪里了,报出这两个错,vc也没提供什么有用的线索,请指点!一句两句的线索也请不吝赐教!

  • 写回答

5条回答 默认 最新

  • bug菌¹ Java领域优质创作者 2023-02-06 11:26
    关注

    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); 会执行,具体有待探究。大家一起探讨。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 2月14日
  • 已采纳回答 2月6日
  • 创建了问题 1月31日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改