0

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

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

我尝试了两种方法来删除所有结果项。

变体 1 - 它调用IResultData::DeleteAllRsltItems()哪些退货E_UNEXPECTED和物品没有被删除 - 它们只是留在那里。

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

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

4

1 回答 1

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

于 2011-07-27T20:58:30.780 回答