我们遇到基于ATL的Visual C ++ MMC管理单元的问题。我们有一个只在范围窗格中显示的范围项。选择此项后,它会使用一组结果项填充结果窗格。
当用户选择“删除所有项目”弹出菜单命令时,我们会调用我们的管理单元代码 - 首先它会执行一些工作,然后继续清除结果视图。我们需要以下行为:用户单击该菜单项,调用我们的自定义代码执行有用的工作,然后所有项目从结果窗格中消失,范围项目保持选中状态。
我尝试了两种删除所有结果项的变体。
变体1 - 它会调用IResultData::DeleteAllRsltItems()
,返回E_UNEXPECTED
并且不删除项目 - 它们就会停留在那里。
VAriation 2 - 它会为优先插入结果窗格的每个项目调用IResultData::DeleteItem()
。同样,每次调用都会返回E_UNEXPECTED
,并且不会删除项目。
如何从MMC视图中正确删除所有结果项?
答案 0 :(得分:0)
我们在OnShow处理程序中执行此操作。所有子项都将被删除:
CComPtr<IResultData> pResultData;
result = pConsole->QueryInterface(IID_IResultData, (void **)&pResultData);
assert( SUCCEEDED(result) );
pResultData->DeleteAllRsltItems();
然后重新添加:
RESULTDATAITEM rdi;
ZeroMemory(&rdi, sizeof(RESULTDATAITEM) );
rdi.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
rdi.nImage = m_resultChildren[i]->GetBitmapIndex();
rdi.str = reinterpret_cast< wchar_t* >(MMC_CALLBACK);
rdi.nCol = 0;
rdi.lParam = (LPARAM)m_resultChildren[i].get();
HRESULT result = pResultData->InsertItem( &rdi );
这可以删除结果项。我假设您在导致E_UNEXPECTED的代码中有另一个问题。