这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 测试测量 » 系统dll调用引起的程序崩溃问题[转来分享]

共2条 1/1 1 跳转至

系统dll调用引起的程序崩溃问题[转来分享]

工程师
2013-05-08 11:19:35     打赏
最近调试项目,发现了一个令人头疼的问题:
之前程序运行没有任何问题,生成exe后,运行也没问题,都正常。但改动了点东西,又在LabVIEW下运行也没问题,生成exe后再运行,程序一退出就提示系统错误,说指令0x04b830be引用的什么内存不能为write之类的(就是windows经常出现的那种要你选择关闭程序还是调试程序的那种)。
以为是我新增加的地方出了问题,花了N多心思,一点点排查,结果把新加的东西都剔除干净了,问题依然没解决。
头开始变的很大很大了现在

偶然间,我发现了一件事,在生成exe后,目录下有个data文件夹,本来是存放程序的附加数据文件的,我居然在里面发现了kernel32.dll这个系统文件!
然后我就在项目里查找是哪个vi调用了它,结果发现是vi.lib里的一个叫“ASCII-Unicode字符串转换”的vi引用了kernel32.dll里的GetACP,MultiByteToWideChar两个函数,并且在配置里库名称路径显示的是:c:\windows\system32\kernel32.dll。问题就在这里了,当我把这个路径改成kernel32.dll而不加前面的那一坨(c:\windows\system32\)时,再生成exe,运行,一切正常,问题消失了!!

分析了一下,造成这个现象的原因可能是这样的:
在某次修改程序时,想调用kernel32.dll里的一个函数,并在配置路径时,写成了c:\windows\system32\kernel32.dll,然后连带着导致了LabVIEW自带的vi库里对该dll文件的引用路径发生变化,并在自己不注意的情况下,把这个改动保存了。然后LabVIEW就“认为”这个dll不是系统的,在生成exe后将其放入到了附属的data目录下。
当exe运行时,加载估计也是这个存在data目录下的kernel32.dll,于是和Windows自带的文件产生了冲突,当然在运行时可能看不出来,在退出的时候估计这个dll要调用什么资源释放之类的东西就冲突了。

总结:
在使用“库函数节点”调用系统dll时,不要额外的加一个c:\windows。。的路径,直接写dll的文件名就可以了,否则遇到这样的问题,还真是头疼。

在此将这个“小经验”共享给大家,希望各位不要因此问题而头疼!




关键词: 系统     调用     引起     程序     崩溃     问题     转来     分享    

高工
2013-05-08 12:46:31     打赏
2楼
软件这种问题比较多,大都是弹框后没有反应

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]