请教大牛一个Dll调用的问题,谢谢

jjajun 2012-07-09 10:19:15
现在调用别人的一个dll文件,但是该dll有个bug,在一种特别的情况下,该dll就会内存越界,(该dll就是弹出一个窗口,然后在该窗口传一个较大字符串时,dll就会越界)。这样就会导致我自己本身的程序也会崩溃。

现在无法拿到该dll的源码,但是程序必须调用该dll(该dll还实现了其他很多功能),现在能有什么好的方法,可以让dll挂掉的时候,我自己的程序做一下保护,不至于挂掉什么的,谢谢。
...全文
157 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Liberty-Bird 2012-07-09
  • 打赏
  • 举报
回复
如果try-catch不行, 按以下方法试试:
DLL提供的界面打开后, 在主调程序开辟线程函数, 里面获取对话框窗口指针, 遍历子控件获取到编辑框控件, 然后通过钩子函数截获编辑框字符变化的消息, 进行预处理(例如字符串数据过长时, 直接弹出消息框告诉用户不能输入过长的数据)
赵4老师 2012-07-09
  • 打赏
  • 举报
回复
楼主不会用strncpy吗?
jjajun 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
1、可以使用进程外组件进行封装
2、可以使用SetUnhandledExceptionFilter进行结构化异常处理
3、当遇到较大字符串时在exe里对其进行截断

不过这样都不能解决根本问题,因为可能dll挂掉时可能留下某种隐患引发蝴蝶效应,
所以如果该DLL耦合不大的话,可以考虑对部分接口进行替换封装
[/Quote]

谢谢,
“可以使用进程外组件进行封装”,这个是什么意思??
“可以使用SetUnhandledExceptionFilter进行结构化异常处理"这个也不明白是什么意思?
大字符串也是在dll的窗口中进行输入的,我的程序肯定是不能进行任何的捕获的,所以也是没有办法的。

主要是该窗口功能是整个dll的一个很小部分,而且也是在特定的场景下就会发生的。所以,除非不用这个SDT,否则,用户一旦操作该步骤,我的主程序就会挂掉,这样用户肯定不能接受的,

我现在只是不想程序挂掉,最好,还能提示一下用户输入的字符串太长什么的,总之,主程序肯定是在任何场景下都不能挂的。


jjajun 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
还是让它挂掉好

能不能避免出现挂掉的情形?
crashrpt和breakpad都能捕捉崩溃,并生成dump文件,可以在崩溃现场显示出谁崩溃了
[/Quote]
出现问题的窗口,只是他的一个小窗口,平时根本没有人用,而且也是在特定的场景才会出现,所以,最好还是不要让主程序挂掉,这样用户体验不好。
另外,就算捕捉到出现的地方也没有用,因为出现的地方肯定不是在我的代码里,问题肯定是出在dll的代码里,我这边没有源码,也是无法进行修改的
jjajun 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
1 检查一下DLL是否支持ISupportErrorInfo接口
2 如果支持,可以在你自己的程序里,try catch 一下
3 如果不支持,则最好不要在进程内装载该DLL,让另一个服务器装载该DLL然后访问服务器

另外,这种问题最好提到VC/MFC下的ATL版里。
[/Quote]
谢谢。
该Dll只有一个接口,没有其他接口。我程序只是调用的他的一个函数接口,具体弹出对话框什么的流程,
肯定封装在这个接口里面的,所以,比较麻烦。

其实,该dll还是实现了其他很多的功能,出问题的窗口只是他很多窗口中的某一个窗口而已。
现在想屏蔽这个窗口也不行,因为,所以的功能都被封装在dll中了。

另外想问一下“则最好不要在进程内装载该DLL,让另一个服务器装载该DLL然后访问服务器”这个是什么意思,怎么实现。
ouyh12345 2012-07-09
  • 打赏
  • 举报
回复
还是让它挂掉好

能不能避免出现挂掉的情形?
crashrpt和breakpad都能捕捉崩溃,并生成dump文件,可以在崩溃现场显示出谁崩溃了
Coder_Y_Jao 2012-07-09
  • 打赏
  • 举报
回复
1、可以使用进程外组件进行封装
2、可以使用SetUnhandledExceptionFilter进行结构化异常处理
3、当遇到较大字符串时在exe里对其进行截断

不过这样都不能解决根本问题,因为可能dll挂掉时可能留下某种隐患引发蝴蝶效应,
所以如果该DLL耦合不大的话,可以考虑对部分接口进行替换封装
happytengfei 2012-07-09
  • 打赏
  • 举报
回复
1 检查一下DLL是否支持ISupportErrorInfo接口
2 如果支持,可以在你自己的程序里,try catch 一下
3 如果不支持,则最好不要在进程内装载该DLL,让另一个服务器装载该DLL然后访问服务器

另外,这种问题最好提到VC/MFC下的ATL版里。
Saleayas 2012-07-09
  • 打赏
  • 举报
回复
如果你知道怎样调用他的函数让这个 DLL 崩溃!
那么就不要这样调用就好了!
同时不要直接暴露这个 DLL 的导出符号和接口。
翅膀又硬了 2012-07-09
  • 打赏
  • 举报
回复
多测试,找规律,保证调用时候的参数不太大
jjajun 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
楼主不会用strncpy吗?
[/Quote]

^_^,现在是拿不到源码,要是源码在手,什么问题都好解决了。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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