"......应用程序错误"这个字符串的本地化

kenshu 2017-01-16 10:50:47
类似

简体中文下,

abc.exe - 应用程序错误
---------------------------
"0x1174ec43" 指令引用的 "0x01159000" 内存。该内存不能为 "read"。


要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消



英文XP下,会是

abc.exe - Application Error
---------------------------
The instruction at "0x1174ec43" referenced memory at "0x00e11000". The memory could not be "read".


Click on OK to terminate the program
Click on CANCEL to debug the program
---------------------------
OK Cancel


====================================

那以,法文版,德文版下会有不同的本地化提示。

想知道这个本地化的字符串在哪个DLL中,应该如何取?
...全文
197 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenshu 2017-01-20
  • 打赏
  • 举报
回复
谢谢大家,我最终的方法是(还没做完,但技术上不是问题,应该一个晚上可以出来) 找到字符串所在的DLL (ntdll.dll),把里面资源读出来,RT_MESSAGETABLE类型的。 解析一下这个资源(还没做完,不过很简单) 谢谢!
kenshu 2017-01-17
  • 打赏
  • 举报
回复
之所以杀了之后还有错误的对话框,是因为那个对话框不是B的。而是WINDOWS其它工具的。 中文跟英文的我就直接 SendMessage(...WM_CLOSE...);
kenshu 2017-01-17
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
如果是我,B.exe中只调用一次C.dll中所需功能就退出,A.exe中每次使用所需功能对应执行B.exe一次。 如果连这样也无法避免B.exe弹出"......应用程序错误"对话框,A.exe中启动B.exe后,取到B.exe应返回的数据或超时比如5秒后,强行杀掉B.exe对应进程。
是的,我就是这样。 WaitForSingleObject(ls_info.hProcess,time_out); TerminateProcess(ls_info.hProcess,-1); 我等的是一分钟。
赵4老师 2017-01-17
  • 打赏
  • 举报
回复
如果是我,B.exe中只调用一次C.dll中所需功能就退出,A.exe中每次使用所需功能对应执行B.exe一次。 如果连这样也无法避免B.exe弹出"......应用程序错误"对话框,A.exe中启动B.exe后,取到B.exe应返回的数据或超时比如5秒后,强行杀掉B.exe对应进程。 多进程思想参考《Unix编程艺术》 如果楼主以为我的办法影响效率,参考下面: 无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
Yofoo 2017-01-17
  • 打赏
  • 举报
回复
建议的方法还是用 SetUnhandledExceptionFilter 你用 __except , 如果破坏太严重, 你的__except里面内部的代码可能还会异常, 你可以试试在 __except里面直接退出进程, 由父进程获取退出代码去记录错误 用调试的方式启动进程, 这个方法是比较麻烦的, 你可以查考MSDN或到网上搜索 WaitForDebugEvent 虽然麻烦但是功能很强大, 主要函数 DebugActiveProcess, WaitForDebugEvent, ContinueDebugEvent
kenshu 2017-01-17
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
http://blog.csdn.net/zhao4zhong1/article/details/53078924
我知道赵老师很强。不过我这个真没法调试。 我现在的过程是,A.exe 运行 b.exe ,b.exe 调用 c.dll. C.DLL不是我的。它会导到 b.exe 崩溃。 这里我就把b.exe关掉,但关掉后,WINDOWS的错误报告会弹出一个出错了。(或有调试器的机上,会场弹出另一种错误) 我现在想: 1.要么不弹出错(前提是不能禁用windows错误报告) 2.要么,我FindWindow,找到了就关掉,但是不同语言的操作系统,这个窗口会不同。我想知道这个字符串在哪里。 我的机上有如下虚拟机可供测试: G:\VMFILE\Windows XP Arabic G:\VMFILE\Windows XP Czech(捷克) G:\VMFILE\Windows XP Dutch(荷兰) G:\VMFILE\Windows XP EN G:\VMFILE\Windows XP EN-Arabic G:\VMFILE\Windows XP EN-Chinese G:\VMFILE\Windows XP EN-Macao G:\VMFILE\Windows XP EN-Singapore G:\VMFILE\Windows XP French G:\VMFILE\Windows XP German G:\VMFILE\Windows XP Greek G:\VMFILE\Windows XP HongKong G:\VMFILE\Windows XP Italian G:\VMFILE\Windows XP Japanese G:\VMFILE\Windows XP Korean G:\VMFILE\Windows XP Korean_Pro-K-SP3-VL-87427 G:\VMFILE\Windows XP Polski(波兰) G:\VMFILE\Windows XP Portuguese G:\VMFILE\Windows XP Portuguese(Brazil) G:\VMFILE\Windows XP Professional x64 Edition G:\VMFILE\Windows XP Russian G:\VMFILE\Windows XP Sabra(希伯来) G:\VMFILE\Windows XP Spanish G:\VMFILE\Windows XP Taiwan 但我认为 还不能保证所有情况,所以我想找个通用的。
kenshu 2017-01-17
  • 打赏
  • 举报
回复
引用 7 楼 zzz3265 的回复:
方法很多 你可以在子程序加个异常捕获的功能, 出现异常自己直接退出测序, 这样就没这个弹窗了 可参考SetUnhandledExceptionFilter 也可以用调试的方式启动进程, 进程异常会收到事件, 可自定义控制
1.VC6的, __try{ CALL_DLL(); } __except(EXCEPTION_EXECUTE_HANDLER){ LOG();//这里确实捕捉过很多可能导致崩溃的错误,但问题是,它还有啊。 return -10002; } --------------------- 2."也可以用调试的方式启动进程" 应该怎么做? 谢谢!
Yofoo 2017-01-17
  • 打赏
  • 举报
回复
方法很多 你可以在子程序加个异常捕获的功能, 出现异常自己直接退出测序, 这样就没这个弹窗了 可参考SetUnhandledExceptionFilter 也可以用调试的方式启动进程, 进程异常会收到事件, 可自定义控制
kenshu 2017-01-17
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏! 搜“GDI泄露检测” 让用户使用手机拍摄并自动翻译的APP。
我的问题是,没办法去调试(其实也没必要) 我的程序,出于各种原因,需要调用人家的DLL(不是我的),因为这个DLL要处理的东西相当复杂,偶尔会出错。 这个我可以理解。(虽然说的是偶尔,但几十万次的调用,给个万份之一的崩溃率就很高了) 那么,我不想我的程序A出错, 处理的方法就是,做另外一个B.exe,由B.exe去调人家的DLL,出错时,就由我的主程序A.exe结束掉B //A实际上就相当于三楼说的"看门狗"
赵4老师 2017-01-17
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏! 搜“GDI泄露检测” 让用户使用手机拍摄并自动翻译的APP。
kenshu 2017-01-17
  • 打赏
  • 举报
回复
引用 3 楼 VisualEleven 的回复:
你可以换个方法,弄个后台的看门狗程序(可以是Windows服务或者是常驻后台的App),定时与你的程序通讯,如果在指定的超时间隔时间段内没有收到回复,就强制关闭程序(如进程存在)然后重启程序。
谢谢! 我实际上已经这么做了。 但还是有问题。 因为弹出的这个窗口,并不是出错的那个程序弹出来的。 (在没有调试器的机上:) 是dwwin.exe (Microsoft Application Error Reporting,发送错误报告的那个WINDOWS自带的程序。) 因为出错的情况不可控,不想用户过个一两天,整个桌面几十个 "XXX has encountered a problem and needs to close. We are sorry for the inconvenience." 的窗口。 我想自动帮他们关掉。前提是,我没办法要求用户禁用WINDOWS错误报告。
Eleven 2017-01-17
  • 打赏
  • 举报
回复
你可以换个方法,弄个后台的看门狗程序(可以是Windows服务或者是常驻后台的App),定时与你的程序通讯,如果在指定的超时间隔时间段内没有收到回复,就强制关闭程序(如进程存在)然后重启程序。
赵4老师 2017-01-17
  • 打赏
  • 举报
回复
将 TerminateProcess(ls_info.hProcess,-1); 改为 WinExec("cmd /c taskkill /F /IM B.exe",SW_HIDE); WinExec("cmd /c taskkill /F /IM WerFault.exe",SW_HIDE);
kenshu 2017-01-16
  • 打赏
  • 举报
回复
在不安装调试器的机上,出错的提示为 XXX 遇到问题需要关闭。我们对此引起的不便表示抱歉。 英文的为 XXX has encountered a problem and needs to close. We are sorry for the inconvenience. 同样,在其它不同语言的WINDOWS下,也会有不同的提示。 我想知道这个提示具体的一模一样的字符串,应该怎么取。 谢谢!
kenshu 2017-01-16
  • 打赏
  • 举报
回复
其实是,我的主程序会调用一个子程序,它可能会出错(因为它们调用了别人的DLL)。 我主程序想通过查找对应的窗口标题,如果子找到,就关掉这个错误提示并继续。 现在中文版/英文版的已经实现了,问题是,我没办法安装所有不同语言版本的WINDOWS来测试。 所以我想知道这个具体的字符串,存在于是哪个DLL中,应该如何取? 谢谢!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧