IResultData :: DeleteItem和IResultData :: DeleteAllRsltItems返回E_UNEXPECTED

时间:2010-11-29 15:08:47

标签: windows visual-c++ mmc

我们遇到基于ATL的Visual C ++ MMC管理单元的问题。我们有一个只在范围窗格中显示的范围项。选择此项后,它会使用一组结果项填充结果窗格。

当用户选择“删除所有项目”弹出菜单命令时,我们会调用我们的管理单元代码 - 首先它会执行一些工作,然后继续清除结果视图。我们需要以下行为:用户单击该菜单项,调用我们的自定义代码执行有用的工作,然后所有项目从结果窗格中消失,范围项目保持选中状态。

我尝试了两种删除所有结果项的变体。

变体1 - 它会调用IResultData::DeleteAllRsltItems(),返回E_UNEXPECTED并且不删除项目 - 它们就会停留在那里。

VAriation 2 - 它会为优先插入结果窗格的每个项目调用IResultData::DeleteItem()。同样,每次调用都会返回E_UNEXPECTED,并且不会删除项目。

如何从MMC视图中正确删除所有结果项?

1 个答案:

答案 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的代码中有另一个问题。