DWORD dwCount = MonthCal_GetMonthRange(m_Calender.GetSafeHwnd(), GMR_DAYSTATE, NULL);
这个
documentation
说第三个参数不能
NULL
:
指向双元素数组的指针
SYSTEMTIME
将接收由dwflag指定的作用域的上下限的结构。下限和上限位于
lprgSysTimeArray[0]
和
lprgSysTimeArray[1]
,分别是。这些结构的时间成员将不会被修改。此参数必须是有效的地址,不能
无效的
.
运行代码时,我得到
dwCount = 4
和
pDayState->cDayState = 395234
结果:
MONTHDAYSTATE *pmdState = new MONTHDAYSTATE[4];
...
InitDayStateArray(...)
{
iMonthCount = pDayState->cDayState
pDayState = pmdState;
memset(pDayState, 0, sizeof(MONTHDAYSTATE)*395234);
...
}
注意
memset
导致缓冲区溢出
(395234 - 4) * sizeof(MONTHDAYSTATE)
这会导致严重的问题。
您可以按如下方式重写代码:
void CHomeAwayMaintPage::OnMcnSelchangeMonthcalendar1(NMHDR *pNMHDR, LRESULT *pResult)
{
SYSTEMTIME systime[2];
int month_count = MonthCal_GetMonthRange(m_Calender.GetSafeHwnd(),
GMR_DAYSTATE, &systime);
std::vector<MONTHDAYSTATE> vec(month_count); //or use new/delete
COleDateTime date(systime[0]);
COleDateTime end(systime[1]);
COleDateTimeSpan spnDay;
spnDay.SetDateTimeSpan(1, 0, 0, 0);
while (date < end)
{
CString str = date.Format(_T("%Y-%m-%d"));
TRACE(_T("datDay %s\n"), str.GetString());
date = date + spnDay;
}
*pResult = 0;
}
更新
基于以上答案(谢谢)和这里的注释,我能够简化我的事件处理程序并正确地执行它:
void CHomeAwayMaintPage::OnGetDayStateCalendar(NMHDR* pNMHDR, LRESULT* pResult)
{
NMDAYSTATE *pDayState = (NMDAYSTATE*)pNMHDR;
if (pDayState != nullptr)
InitDayStateArray(pDayState->cDayState,
pDayState->prgDayState, COleDateTime(pDayState->stStart));
*pResult = 0;
}
Here
它说:
“它接收提供此数据的数组的地址。”
我被搞糊涂了
this
你必须设置缓冲区的地方。
如您所见,传入的结构已经分配了缓冲区。我只需要调整一下数值。任何地方都没有内存分配。