运行时错误48加载dll错误_运行时错误:Error: no data exchange control with ID 0xXXXX

问题

有时候会碰到一些奇怪的运行时问题,如标题所示。

当我们在VS中拖了一个控件到对话框模板上,我们通常会将这个控件绑定到一个变量上。例如,我们会将一个CButton绑定到一个按钮,将CEdit绑定到一个编辑框。如果没有给予特别的注意,就会出现如下的错误:

Error: no data exchange control with ID 0xXXXX

并且,这个错误仅在Debug版本出现,而且它还是隐藏在MFC的调试输出中。如果你直接跑一个有问题的程序,你仅仅会看到一个通用的,平淡无奇的断言失败错误,进而整个应用程序走向生命的终点。

下面介绍可能的原因:

资源ID重复

随着工程的规模越来越大,我们使用的控件也会随之增加,如果不小心,将一个控件的资源ID和另一个控件的ID重复了,那么在DDX_Control阶段就会让MFC框架犯难了:为什么这个ID标识的是一个按钮,你却要绑定到一个CEdit变量上。

原因就在于,这个ID不仅是按钮的ID,也同时是编辑框的ID。通常,这个错误很容易找到,直接打开resource.h,查看那些控件共用相同的ID即可。以下是代码片段:

#define IDC_BUTTON1 122

#define IDC_EDIT1 122

不在控件所在的父窗口执行DDX_Control

这个原因比较少见,也比较隐秘。有时候代码写太多,一下子脑袋犯迷糊就会犯这样的错误。需要牢记:一般DDX_Control需要在控件的父窗口执行,否则也会出现如上的错误。

总结

1) 保持控件的ID唯一

2) 检查DDX_Control是否出现在正确的父窗口代码中。

ecb680ad457e02cfeb574636b0003a58.png

版权声明:本文为weixin_39842918原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。