创建一个Dialog工程, 当手动修改resource.h中dialog的资源ID时引起程序异常终止.大家可以试试, 编译无异常, 而运行就出错.
我分析了下, 问题是这样的:为了方便描述, 假设对话框类为CMyDialog, 应用程序类为CMyApp.
对应的文件分别为: CMyDialog.cpp/CMyDialog.h, CMy.cpp/CMy.h
资源文件为: My.rc
My.rc和CMy.h包含resource.h, CMy.cpp和CMyDialog.cpp包含CMy.h, CMyDialog定义中有一句:// 对话框数据
enum { IDD = IDD_MY_DIALOG };IDD_MY_DIALOG就是对话框ID, 
构造函数会使用它创建对话框本身.
CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/)
: CDialog(CDlg_STDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
当修改resource.h时应该引起CMy.cpp的重编译, 进而编译CMyDialog.cpp, 
问题就在08只编译了My.rc, 这样CMy.cpp不编译, CMyDialog.cpp也就无法编译.
最终造成IDD_MY_DIALOG与资源文件中的实际数据相左.
更近一步, 如果在resource.h中修改其它ID不会造成程序直接崩溃, 
因为当windows创建对话框时从资源文件中取出ID构造控件与CMyDialog.cpp中的代码无关.
但是当使用资源ID访问控件时会发生错误, 原因同上.
举个例子:
一个Button, ID为ID_BUTTON_CUS = 2345, 
编译程序, 
CMyDialog.cpp中有句代码SetDlgItemText(ID_BUTTON_CUS, "title");
编译程序.
最后在resouce.h中修改为1234.
编译程序, SetDlgItemText执行失败, 标题没有改变.注意: 同样的问题也会发生在CMy.cpp中.解决办法是强制编译任何依赖resouce.h而没有引起重编译的文件, 或者直接清理解决方案.
目前不知道其它类型工程是否同样存在问题.MS推荐使用对话框编辑器编辑对话框,不知道这是真的bug呢还是MS在"贯彻指导方针".

解决方案 »

  1.   

    我也碰到个BUG,把可执行文件当资源添加到项目中,删除了在按相同ID添加该资源,会出问题,就算在resouce.h把添加的资源号删除了也还是出问题.
      

  2.   

    我也碰到个BUG,把可执行文件当资源添加到项目中,删除了在按相同ID添加该资源(可执行文件被修改了),会出问题,就算在resouce.h把添加的资源号删除了也还是出问题.
      

  3.   

    问题就在08只编译了My.rc, 这样CMy.cpp不编译, CMyDialog.cpp也就无法编译. 
    最终造成IDD_MY_DIALOG与资源文件中的实际数据相左. 
    =============================================================
    这点说的有问题, CMyDialog.cpp包含CMy.h, CMy.h包含resouce.h, 
    正常依赖应该为, resouce.h CMy.h CMyDialog.cpp, 
    CMy.h是个头文件不用编译, 但是应该写上CMyDialog依赖resouce.h.