MFC非模态对话框中,点击Button启动另一个模态对话框,弹出“不支持尝试执行的操作”

>>===问题现象===<<

正在做的一个命令启动后,会打开一个非模态对话框A,点击其中的一个Button按钮,会DoModal()另一个模态对话框B。

但从某一个变更集开始,启动命令点击Button后会弹出“不支持尝试执行的操作”的提示对话框,点该对话框的“确定”后,继续弹出“不支持尝试执行的操作”

对话框B在多个地方都会启动,也有从其他对话框DoModal()打开的,除了对话框A,其他地方都能正常启动。

 

>>===问题研究===<<

发现问题后真是百思不得其解,查了很多中文网站,关于弹出“不支持尝试执行的操作”,主要查到以下两种情况:

(1)删除了对话框中的控件,但没有删除控件关联的变量或者在DoDataExchange()对应的DDX。

(2)resource.h中ID重复。

第一种情况,对话框B中不存在这种问题。

第二种情况,在对话框B的资源中确实有很多ID对应的序号(如:#define  IDC_XXX_XXX  1000,序号为:1000),在同一资源文件中是重复的。查了一下序号重复的问题,对话框B控件的ID序号都没有重复的,其他有重复的ID,在相应的对话框中也没有问题。

加断点后,发现DoModal()后进入B对话框的OnInitDialog(),分别在CDialogEx::OnInitDialog()和UpdateData(FALSE)两处进入DoDataExchange(),就是“不支持尝试执行的操作”弹出两次的原因,那问题应该就出在DoDataExchange()这。

在DoDataExchange()里,有对话框B的三个DDX_Control,问题对话框是在走到第一个DDX处跳出的。后依次分别注掉三个DDX,仍然打不开对话框B。最后将三个DDX都注掉,点击对话框A的Button后打开了一个对话框C,但是不是对话框B!并且点击对话框C中和对话框B一样的"确定"等按钮,还是进入了对话框B的函数。

到这里基本找到了问题所在,应该是整个解决方案的MFC资源出现了混乱,具体原因不详,而且查了出现问题的附近的两个变更集号,中间并没有特别的修改。

查了对话框C的资源,发现对话框C的ID序号跟对话框B的ID序号是一样的,都是1002!但很奇怪,对话框C和对话框B是在两个不同的工程中,而且对话框B在其他地方都能DoModal()打开,应该不是简单的序号重复,但更底层的暂时不知道原因。

 

>>===问题解决===<<

将对话框B的ID序号改成一个资源中还没用过的,但没有超过B所在工程资源最大值的一个数字,并且不与对话框C的重复,编译后就对了。

 

>>===问题总结===<<

归根结底,还是资源出现了问题,与查到的第二种情况类似,但是是同一解决方案下不同项目的资源间的重复。

以后遇到类似进入DoDataExchange()的问题,可以先把疑似有问题的DDX注掉,看对话框是否能启动。DDX与对话框启动无关,主要是数据的传递。网上查到的情况,注掉DDX就能正确显示,那是DDX的问题,这里注掉DDX显示了其他的对话框,那就要考虑其他的情况了。

Debug查问题还是要善于加断点、合理注释代码!

你可能感兴趣的:(MFC)