CCfgSheet dlg("Configure",this);
if(IDOK==dlg.DoModal())
{
 m_DataToSet.m_UpsConfig.csBatNum = dlg.m_UpsConfigPage.m_csBatNum;//这句报错
}
dlg是CPropertySheet
m_UpsConfigPage是CPropertyPage
csBatNum是CString类型
m_csBatNum绑定Edit控件的CString类型变量

解决方案 »

  1.   

    只有CString类型会出错,如里把那句改成:
    m_DataToSet.m_UpsConfig.bComType = dlg.m_UpsConfigPage.m_bComType;
    却不会出错。
      

  2.   

    先把CPropertyPage里的值传到CPropertySheet
    再从CPropertySheet取值。
      

  3.   

    晕,把它改成m_DataToSet.m_UpsConfig.csBatNum = "ggsg";也会出错,看来是左边的问题。
    m_DataToSet是DataToSet类型,可是这样怎么会出错呢?
    typedef struct _UPSConfig
    {
    //UPS参数
    BOOL   bComType;
    USHORT uComType;
    BOOL    bBatNum;
    CString csBatNum;
    }UPSConfig;typedef struct _DataToSet
    {
    UPSConfig   m_UpsConfig;
            ......
    }DataToSet;
      

  4.   

    确保DataToSet对象是在跟对话框相同的模块(EXE/DLL)里创建的实例
      

  5.   

    m_DataToSet.m_UpsConfig.csBatNum 
    调试看一下,m_UpsConfig的各项成员的值是否有效状态
      

  6.   

    没有错误提示,直接就跳到汇编代码了,我猜是不是结构体定义不合法?这段代码是在CMainFrm的菜单响应函数里调用的,而m_DataToSet是CMainFrm的公共成员变量。
      

  7.   

    一个简单的赋值,而两边都是CString类型,不可以越界。
      

  8.   

    m_DataToSet.m_UpsConfig.csBatNum的地址有没有问题?
      

  9.   

    找出出错的地方了,在那句之前我加了一句:
    memset(&m_DataToSet,0,sizeof(m_DataToSet));
    删除这一句就可以了,可以为什么呢?
      

  10.   

    sizeof是不能用来计算含有非简单类型的数据结构的,比如你这里的CString类型。如果都是BOOL,int,double等才可以这么做。
      

  11.   

    那我要怎样实现跟memset相同的功能呢?
      

  12.   


    CString是个类对象,不是简单的结构,一般对象里会包含指向方法表的指针,你全部清零,意味着把这个指针也清掉了,对象调用成员方法时会内存访问越界,当然会出错。
    对于对象初始化,不能简单调用memset的,一般只有结构体才可以这样做,呵呵
      

  13.   


    两种选择,一种是把CString csBatNum;改成系统内置类型,如字符串数组char csBatNum[50];但前提是你知道这个字符串的最大长度,这样就可按你的方法初始化。
    另一种,专门写个类似的初始化函数,在里面分别对成员变量置初始值。
      

  14.   

    CString等,可以直接赋值 = ""; 空字符串来清零
      

  15.   

    直接赋值 CString str = L"";
      

  16.   

    这种理解是错误得,内存访问越界又不一定是出错这行出现得。建议楼主看看http://blog.vckbase.com/arong/archive/2010/01/27/40598.html