【问题标题】:MFC DateTimePicker crash app when open calendar widget打开日历小部件时 MFC DateTimePicker 崩溃应用程序
【发布时间】:2016-02-17 19:14:30
【问题描述】:

我在 Visual Studio 2013、Win7 32 位上开发 C++/MFC 应用程序。我有一个带有对话框的主应用程序,我在其中放置了一个 DateTimePicker MFC 对象。对于初始化,我使用了DDX_DateTimeCtrlm_odtFilterData 成员变量。

void CClassDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_DateTimeCtrl(pDX, IDC_DATE, m_odtFilterData);
}

BOOL CClassDlg::OnInitDialog()
{
    COleDateTime odtCurrDate = COleDateTime::GetCurrentTime();
    m_odtFilterData.SetDate(odtCurrDate.GetYear(), 1, 1);

    CDialog::OnInitDialog();
    //etc etc
    UpdateData(FALSE);

    return TRUE;
}

添加日期时间更改事件后

BEGIN_MESSAGE_MAP(CClassDlg, CDialog)
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATE, &CClassDlg::OnDtnDatetimechange)
END_MESSAGE_MAP()

void CClassDlg::OnDtnDatetimechange(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMDATETIMECHANGE pDTChange = reinterpret_cast<LPNMDATETIMECHANGE>(pNMHDR);

    if(m_odtExampleODTVarThatIHave > m_odtFilterData)
    {
        //do stuff
    }

    *pResult = 0;
}

问题是,当我在对话框中使用 datetimepicker 选择日期时,有时应用会因以下错误而崩溃:

Windows has triggered a breakpoint in AppName.exe.
This may be due to a corruption of the heap, which indicates a bug in AppName.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while AppName.exe has focus.
The output window may have more diagnostic information.

输出只说:

HEAP[AppName.exe]: HEAP: Free Heap block 279850 modified at 279e1c after it was freed

而且断点卡在mfc\appmodul.cpp:

extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    _In_ LPTSTR lpCmdLine, int nCmdShow)
#pragma warning(suppress: 4985)
{
    // call shared/exported WinMain
/*->*/return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}

这很奇怪,只需单击显示月份小部件的 datetimepicker 按钮几次。如果,而不是小部件,我使用 Spin Control 一切正常......你有什么想法吗? The button that open the month widget

另一件事,如果我删除了

if(m_odtExampleODTVarThatIHave > m_odtFilterData) 

一切正常。似乎由于某种原因,m_odtFilterData 变量被月份小部件损坏。我不明白我的错误在哪里。

【问题讨论】:

    标签: c++ visual-c++ visual-studio-2013 mfc datetimepicker


    【解决方案1】:

    我看到的明显问题是您忘记在CClassDlg::DoDataExchange(CDataExchange* pDX) 中调用CDialog::DoDataExchange(pDX); 所以它应该看起来像:

    void CClassDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialog::DoDataExchange(pDX);
        DDX_DateTimeCtrl(pDX, IDC_DATE, m_odtFilterData);
    }
    

    还请检查您的CWinApp 派生类的OnInitInstance 中的公共控件是否已正确初始化:

     INITCOMMONCONTROLSEX iccex = { sizeof(INITCOMMONCONTROLSEX), ICC_DATE_CLASSES | ICC_STANDARD_CLASSES };
    
     // Init the common controls.
     InitCommonControlsEx ( &iccex );
    

    还请确保您有正确的清单:

    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
    

    还请检查您的 _WIN32_WINNT 定义。

    【讨论】:

    • 第二个 - 在访问任何子控件之前,您需要从 OnInitDialog() 调用 CDialogEx::OnInitDialog();
    • @Vlad:完全同意。很好的收获。
    • 不,我只忘记了我的代码复制粘贴中的两条指令:我只粘贴了代码的主要部分,我遇到了问题,因为我在对话框中还有其他内容,例如一个编辑控件,一个 ctrl 列表等,但在我使用 datetimepicker 之前一切都很好......还有其他想法吗?我编辑了问题
    • 请将CDialog::OnInitDialog();移动到OnInitDialog()的顶部
    • @user3378687:发布问题时切勿更改代码。生成MCVE 并发布,未删节。如果您发布的代码与您提出的问题不匹配,则它对其他用户和您自己都不再有用。
    猜你喜欢
    • 2012-05-03
    • 2015-08-30
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多