发出读/写动态BYTE数组到注册表

时间:2016-11-17 10:52:00

标签: arrays mfc registry byte

我有这个初始化缓冲区的方法:

void CCreateReportDlg::InitAutoAssignStates()
{
    int iNumColumns = m_Grid.GetColumnCount();

    ASSERT(m_pbyAutoAssignStates == NULL);
    if (m_pbyAutoAssignStates == NULL)
    {
        m_pbyAutoAssignStates = new BYTE[iNumColumns];
        if (m_pbyAutoAssignStates != NULL)
        {
            // This sets them all to AUTO_ASSIGN_INCLUDE
            ZeroMemory(m_pbyAutoAssignStates, iNumColumns * sizeof(BYTE));

            // DATE is never used for auto assign
            m_pbyAutoAssignStates[COLUMN_DATE] = AUTO_ASSIGN_NOT_USED;
        }
    }
}

到目前为止,这么好。此缓冲区将传递到对话框类中。

// Receives pointer to a BYTE* array.
//     This is owned by the parent.
void CAutoAssignSettingsDlg::SetAutoAssignStates(BYTE *pbyAutoAssignStates)
{
    m_pbyAutoAssignStates = pbyAutoAssignStates;
}

没有问题。然后,我在对话框上有一个检查列表,该列表映射到上述缓冲区中的每个状态。

当弹出对话框即将关闭时,它会修改缓冲区:

void CAutoAssignSettingsDlg::UpdateAutoAssignStates()
{
    LVITEM  sItem;
    int     iAssign, iNumAssign;

    if (m_pbyAutoAssignStates != NULL)
    {
        sItem.mask = LVIF_IMAGE|LVIF_PARAM;
        sItem.iSubItem = 0;

        iNumAssign = m_listAssign.GetItemCount();
        for (iAssign = 0; iAssign < iNumAssign; iAssign++)
        {
            sItem.iItem = iAssign;
            m_listAssign.GetItem(&sItem);
            if (sItem.iImage == IMG_CHECKED)
                m_pbyAutoAssignStates[sItem.lParam] = AUTO_ASSIGN_EXCLUDE;
            else
                m_pbyAutoAssignStates[sItem.lParam] = AUTO_ASSIGN_INCLUDE;
        }
    }
}

这一切都有效。但后来我想把它保存到注册表中。目前我这样做:

theApp.WriteProfileBinary(strSection, _T("AssignStates"), m_pbyAutoAssignStates, sizeof(m_pbyAutoAssignStates));

最后,在父对话框中,我调整了从注册表中读取设置的代码。所以现在,在InitAutoAssignStates调用之前,我这样做:

theApp.GetProfileBinary(strSection,_T("AssignStates"), &ppData, &uSize);
if (uSize > 0)
{
    m_pbyAutoAssignStates = new BYTE[uSize];
    memcpy(m_pbyAutoAssignStates, ppData, uSize);
}

// Tidy memory
if (uSize != 0)
{
    delete[] ppData;
    ppData = NULL;
}

如果缓冲区为NULL,则仅调用后续的InitAutoAssignStates方法。所以从理论上讲,我回到了我保存的缓冲区中。但它没有用。在我的复选框中勾选的项目集不匹配。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我发现了一个相关的问题,说如果不知道元素的数量,你就无法做我想要实现的目标。这确实令我感到惊讶,但我不打算争辩。

我调整了我的代码,将元素数量传递给弹出对话框,然后我可以像这样保存:

theApp.WriteProfileBinary(strSection, _T("AssignStates"),
        m_pbyAutoAssignStates, 
        sizeof(m_pbyAutoAssignStates[0]) * m_iNumAutoAssignStateValues);

这可以正常工作。当我读回这个缓冲区后,我的列表中会出现匹配的复选框。