Mfc 在VC+中,将数据从CDATETIMECRL移动到CTime对象+;6.

Mfc 在VC+中,将数据从CDATETIMECRL移动到CTime对象+;6.,mfc,visual-c++-6,Mfc,Visual C++ 6,使用VS6时,我注意到当CDATETIMECRL对象中的日期更改时,我的一些对话框会崩溃。调查发现,对DDX_DateTimeCtrl的调用将12字节的数据移动到4字节宽的CTime对象上。有人能解释为什么会发生这种情况吗?有人知道怎么改正吗 标题: #if !defined(AFX_DATEDIALOG_H__B9373304_D774_4447_A4D1_BB4E1FB3404F__INCLUDED_) #define AFX_DATEDIALOG_H__B9373304_D774_4447

使用VS6时,我注意到当CDATETIMECRL对象中的日期更改时,我的一些对话框会崩溃。调查发现,对DDX_DateTimeCtrl的调用将12字节的数据移动到4字节宽的CTime对象上。有人能解释为什么会发生这种情况吗?有人知道怎么改正吗

标题:

#if !defined(AFX_DATEDIALOG_H__B9373304_D774_4447_A4D1_BB4E1FB3404F__INCLUDED_)
#define AFX_DATEDIALOG_H__B9373304_D774_4447_A4D1_BB4E1FB3404F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// DateDialog.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CDateDialog dialog

class CDateDialog : public CDialog
{
// Construction
public:
    CDateDialog(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
    //{{AFX_DATA(CDateDialog)
    enum { IDD = IDD_DIALOG_DATE };
    CDateTimeCtrl   m_StartDate;
    CDateTimeCtrl   m_EndDate;
    CTime   m_tmEndDate;
    CTime   m_tmStartDate;
    //}}AFX_DATA


// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CDateDialog)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:

    // Generated message map functions
    //{{AFX_MSG(CDateDialog)
    afx_msg void OnButtonBack();
    afx_msg void OnDatetimechangeEndDate(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnDatetimechangeStartDate(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnCloseupStartDate(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnCloseupEndDate(NMHDR* pNMHDR, LRESULT* pResult);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
private:
    // the range limits for the dates; these are set to the values found
    // in m_tmStartDate and m_tmEndDate in OnInitDialog
    CTime m_tmStart;            // beginning of the range
    CTime m_tmEnd;              // end of the range
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DATEDIALOG_H__B9373304_D774_4447_A4D1_BB4E1FB3404F__INCLUDED_)

Code:

// DateDialog.cpp : implementation file
//

#include "stdafx.h"
#include "CustomerSales.h"
#include "DateDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDateDialog dialog


CDateDialog::CDateDialog(CWnd* pParent /*=NULL*/)
    : CDialog(CDateDialog::IDD, pParent)
{
    //{{AFX_DATA_INIT(CDateDialog)
    m_tmEndDate = 0;
    m_tmStartDate = 0;
    //}}AFX_DATA_INIT
}


void CDateDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CDateDialog)
    DDX_Control(pDX, IDC_START_DATE, m_StartDate);
    DDX_Control(pDX, IDC_END_DATE, m_EndDate);
    DDX_DateTimeCtrl(pDX, IDC_END_DATE, m_tmEndDate);
    DDX_DateTimeCtrl(pDX, IDC_START_DATE, m_tmStartDate);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDateDialog, CDialog)
    //{{AFX_MSG_MAP(CDateDialog)
    ON_BN_CLICKED(IDC_BUTTON_BACK, OnButtonBack)
    ON_NOTIFY(DTN_DATETIMECHANGE, IDC_END_DATE, OnDatetimechangeEndDate)
    ON_NOTIFY(DTN_DATETIMECHANGE, IDC_START_DATE, OnDatetimechangeStartDate)
    ON_NOTIFY(DTN_CLOSEUP, IDC_START_DATE, OnCloseupStartDate)
    ON_NOTIFY(DTN_CLOSEUP, IDC_END_DATE, OnCloseupEndDate)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDateDialog message handlers

void CDateDialog::OnButtonBack() 
{
    // exit with our buton ID
    EndDialog(IDC_BUTTON_BACK);
}

void CDateDialog::OnDatetimechangeEndDate(NMHDR* pNMHDR, LRESULT* pResult) 
{
    if(m_EndDate.GetMonthCalCtrl() == NULL)
    {
        UpdateData();

        if(m_tmStartDate > m_tmEndDate)
            m_tmStartDate = m_tmEndDate;

        UpdateData(FALSE);
    }

    *pResult = 0;
}

void CDateDialog::OnDatetimechangeStartDate(NMHDR* pNMHDR, LRESULT* pResult) 
{
    if(m_StartDate.GetMonthCalCtrl() == NULL)
    {
        UpdateData();

        if(m_tmEndDate < m_tmStartDate)
            m_tmEndDate = m_tmStartDate;

        UpdateData(FALSE);
    }

    *pResult = 0;
}

void CDateDialog::OnCloseupStartDate(NMHDR* pNMHDR, LRESULT* pResult) 
{
    UpdateData();

    if(m_tmEndDate < m_tmStartDate)
        m_tmEndDate = m_tmStartDate;

    UpdateData(FALSE);

    *pResult = 0;
}

void CDateDialog::OnCloseupEndDate(NMHDR* pNMHDR, LRESULT* pResult) 
{
    UpdateData();

    if(m_tmStartDate > m_tmEndDate)
        m_tmStartDate = m_tmEndDate;

    UpdateData(FALSE);

    *pResult = 0;
}
#如果!已定义(AFX_DATEDIALOG_H_B9373304_D774_4447_A4D1_BB4E1FB3404F_包含在内)
#定义AFX_DATEDIALOG_H_uuuB9373304_D774_4447_A4D1_BB4E1FB3404F_u包括在内_
#如果MSC版本>1000
#布拉格语一次
#endif/\u MSC\u VER>1000
//DateDialog.h:头文件
//
/////////////////////////////////////////////////////////////////////////////
//CDATE对话框
类CDateDialog:公共CDDialog
{
//建筑
公众:
CDateDialog(CWnd*pParent=NULL);//标准构造函数
//对话框数据
//{{AFX_数据(CDateDialog)
枚举{IDD=IDD_对话框_日期};
CDateTimeCtrl m_StartDate;
CDateTimeCtrl m_EndDate;
CTime m_tmEndDate;
CTime m_tmStartDate;
//}}AFX_数据
//覆盖
//类向导生成的虚拟函数重写
//{{AFX_虚拟(CDateDialog)
受保护的:
虚拟void数据交换(CDATA交换*pDX);//DDX/DDV支持
//}}AFX_虚拟
//实施
受保护的:
//生成的消息映射函数
//{{AFX_MSG(CDateDialog)
afx_msg void OnButtonBack();
afx_msg void OnDatetimechangeEndDate(NMHDR*pNMHDR,LRESULT*pResult);
afx_msg void OnDatetimechangeStartDate(NMHDR*pNMHDR,LRESULT*pResult);
afx_msg void OnCloseupStartDate(NMHDR*pNMHDR,LRESULT*pResult);
afx_msg void OnCloseupEndDate(NMHDR*pNMHDR,LRESULT*pResult);
//}}AFX_味精
声明消息映射()
私人:
//日期的范围限制;这些设置为找到的值
//在OnInitDialog中的m_tmastartDate和m_tmEndDate中
CTime m_tmStart;//范围的开始
CTime m_tmEnd;//范围结束
};
//{{AFX_INSERT_LOCATION}
//微软Visual C++将在前一行之前插入附加声明。
#endif/!已定义(AFX_DATEDIALOG_H_B9373304_D774_4447_A4D1_BB4E1FB3404F_包含在内)
代码:
//DateDialog.cpp:实现文件
//
#包括“stdafx.h”
#包括“CustomerSales.h”
#包括“DateDialog.h”
#ifdef_调试
#定义新调试\u新
#取消定义此文件
静态字符此\u文件[]=\u文件\u;
#恩迪夫
/////////////////////////////////////////////////////////////////////////////
//CDATE对话框
CDateDialog::CDateDialog(CWnd*pParent/*=NULL*/)
:CDialog(CDateDialog::IDD,pParent)
{
//{{AFX_DATA_INIT(CDateDialog)
m_tmEndDate=0;
m_tmStartDate=0;
//}}AFX_数据_初始化
}
void CDateDialog::DoDataExchange(CDATA交换*pDX)
{
CDDialog::DoDataExchange(pDX);
//{{AFX_数据_地图(CDateDialog)
DDX_控制(pDX、IDC_开始日期、m_开始日期);
DDX_控制(pDX、IDC_结束日期、m_结束日期);
DDX_DateTimeCtrl(pDX、IDC_END_DATE、m_tmEndDate);
DDX_DateTimeCtrl(pDX、IDC_开始日期、m_开始日期);
//}}AFX_数据_地图
}
开始消息映射(CDATE对话框、CDialog)
//{{AFX_MSG_映射(CDateDialog)
单击时(IDC按钮返回,按钮返回)
ON_NOTIFY(DTN_日期时间变更、IDC_结束日期、OnDatetimechangeEndDate)
ON_通知(DTN_日期时间更改、IDC_开始日期、OnDatetimechangeStartDate)
ON_NOTIFY(DTN_特写、IDC_开始日期、OnCloseupStartDate)
ON_NOTIFY(DTN_特写、IDC_结束日期、OnCloseupEndDate)
//}}AFX_MSG_地图
结束消息映射()
/////////////////////////////////////////////////////////////////////////////
//CDateDialog消息处理程序
void CDateDialog::OnButtonBack()
{
//带着我们的buton ID离开
结束对话框(IDC按钮返回);
}
void CDateDialog::OnDatetimechangeEndDate(NMHDR*pNMHDR,LRESULT*pResult)
{
if(m_EndDate.GetMonthCalCtrl()==NULL)
{
更新数据();
如果(m_tmastartdate>m_tmEndDate)
m_tmastartdate=m_tmEndDate;
更新数据(假);
}
*预设值=0;
}
void CDateDialog::OnDatetimechangeStartDate(NMHDR*pNMHDR,LRESULT*pResult)
{
if(m_StartDate.GetMonthCalCtrl()==NULL)
{
更新数据();
if(m_tmEndDatem_tmEndDate)
m_tmastartdate=m_tmEndDate;
更新数据(假);
*预设值=0;
}

很久以前,我就观察到CDATETIMECRL的错误。如果与CTime变量一起使用,该类的方法将崩溃。我记得当时我在互联网上找到了与这个问题相关的参考资料。我现在找不到。建议的解决方案是使用COleDateTime

DDE/DDX交换机似乎也存在类似的问题,并且在最新的MFC中尚未解决

当时对我来说,最简单的解决方法是使用COleDateTime变量


它与CTime和COleDateTime一起工作,因此您的解决方案是将COleDateTime用于
m_tmEndDate
m_tmstart date
变量

请在这里发布您的代码,包括头文件中的声明。所以我们可以帮你。