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也没提供什么有用的线索,请指点!一句两句的线索也请不吝赐教!
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); 会执行,具体有待探究。大家一起探讨。
1、
CWinApp::initinstance中(INT_PTR nResponse = dlg.DoModal()这句上中断),时不时报错0x771160D7 (ntdll.dll) (hrSync.exe 中)处有未经处理的异常: 0xC000041D: 用户回调期间遇到未经处理的异常。
这个错误,很大可能是写的dialog/dialogex里使用的指针访问越界了
2、
另外,加载动态库,在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
这个错误,是LoadLibrary执行失败,返回的句柄hdll为NULL,而这个句柄hdll在后续使用导致的断言错误
至于LoadLibrary为什么失败,
先看看入参是否是全路径,如果是全路径,需要确定文件是否存在
如果不是全路径,需要挨个查看进程搜索路径里,是否存在入参指定的文件,同时,确定该文件是你希望加载的文件
这种不是全路径,入参文件存在,但不是你希望加载的文件,通常在开发阶段遇到,比如,动态库更新生成后,没有复制到加载搜索目录
对于第一个错误,0xC000041D: 用户回调期间遇到未经处理的异常,您可以尝试使用调试器或者在代码中使用异常处理机制(如try-catch)来捕获该异常
对于第二个错误,Debug Assertion Failed! f:\dd\vctools\vc7libs\ship\atlmfc\src\atl\atls\atldebugapi.cpp,Line 50,Expression: pModule != 0,这可能是因为LoadLibrary返回的句柄无效导致的。可以尝试检查加载的动态库的路径是否正确,也可以使用GetLastError来了解更多错误信息。
0xC000041D 错误通常是由于捕获了在用户回调函数中未处理的异常,因此可以在程序中进行更详细的调试。
Debug Assertion Failed 错误通常是因为 LoadLibrary 函数未正确加载库,返回了空指针。可以检查 plugPathList[i] 变量是否指向正确的路径,以及该路径的动态库是否存在、有效。
为了确保程序的正常运行,建议对代码进行更详细的调试和测试。
花了一个星期终于把问题解决了,但是前后修改了很多细节,都改晕了,都搞不清问题的根治具体在哪里了。主要是改了几个方面:
1、工程中不小心出现了第三方库的两个版本,有两三个自己的头文件也重复了,这个可能是问题一
2、程序内存泄露了很多内存,按理说进程结束后windows会回收内存,但是测试中发现,往往编译后第一次运行程序正常,然后,有时第二次运行开始失败,有时第三次、第四次运行开始失败,完后就一直失败,难道是内存没回收,内存碎片太多,造成意想不到的异常?
3、主程序创建了一个类A,传递给自己的dll,这里命名为D,D加载后,主程序通知D开始运行,D就启动一个线程;
异常出现在主程序退出的时候,这时我在A的构析函数里干了几件事
1、通知D结束线程,
2、WaitForSingleObject....
3、delete了一堆变量
忘了没有调用FreeLibray释放D的句柄
异常就出在delete的时候
好像是调整了执行顺序,先停D的线程,再deleteA,再FreeLibray释放D的句柄,这样就不再报异常了
谢谢各位!