cvi的uir函数尸体导致的运时时错误(qzm原创)
一大早,写好今天的工作计划, 打开昨天下班时还debug ok的cvi项目,谁知,出现了一个run-time error:
http://blog.gkong.com/uploadfile3/200942110595155.gif
断点停在如下图所示的位置.
http://blog.gkong.com/uploadfile3/2009421105951983.jpg
从第一个错误提示中我们可以看出以下有用的信息:
(1) 这是个运行时错误,不是编译错误,这种错误比编译错误难排查.
(2) cvi运行时错误检测机制找到错误的语句的位置(但通常来说,运行时错误,的发生,并不是断点停留的位置,因为,cvi在函数中也有它的相应的检测代码,当它在函数中检测到错误或不能满足它的运行环境时,也会报错.)
(3) 关键字分析:
a) the callback function - 说明有可能和 回调函数有关
b) openclient_managerwin - 看起来象是个函数,因为,用了谓语(我写的,但久了,我都忘了,呵呵).
c) specified in the uir file - 该函数被定义在 与uir相关的模块中
d) if you are using an external compiler, you must include the uir callbacks object or source file in the executable or dll -
这是cvi编译器自已分析后给出可能的错误原因,其实是个误导。
http://blog.gkong.com/uploadfile3/20094211106294.jpg
从上图的标识中,知道,cvi 用panel_combtn_client_manager 和 openclient_managerwin 回调函数产生了关联(应是一对多的关联,学过mfc就能很好地理解 cvi的工作原理和机制,因为mfc比cvi难了1个数量级)。
(4)错误的原因和为什么会报错。
从代码中我们能看到只不过是在与uir相关联的模块中声明了“panel_combtn_client_manager ”句柄(在xx.h) 和定义了一个回调函数体(xx.c)。难道cvi放他们在这里暂时不用不时吗?为什么非要报错呢?
原因就在于,cvi在我们不可见的地方管理着以 uir中的控件(如按键)、 句柄、回调函数之间的关系,当我们一按按键,就能进入相应的回调函数的机制,但当把控件kill掉后,在运行程序时,cvi由于不能找到满足“回调机制”的存在于uir中的控件(在代码中是以常数指代的),所以报错。
http://blog.gkong.com/uploadfile3/200942111028579.jpg
----------------------------------------------
此篇文章从博客转发
原文地址:
Http://blog.gkong.com/more.asp?id=85154&Name=zjcsharp