2010-11-29 11 views
0

Wir haben ein Problem mit einem ATL-basierten Visual C++ MMC Snapin. Wir haben ein Bereichsobjekt, das nur im Bereich "Bereich" angezeigt wird. Wenn dieses Element ausgewählt ist, füllt es den Ergebnisbereich mit einer Reihe von Ergebniselementen.IResultData :: DeleteItem und IResultData :: DeleteAllRsltItems geben E_UNEXPECTED zurück

Wenn der Benutzer den Popup-Menübefehl "Alle Objekte löschen" auswählt, wird unser Snapin-Code aufgerufen - zuerst macht er etwas Arbeit und fährt dann mit dem Löschen der Ergebnisansicht fort. Wir möchten folgendes Verhalten: Der Benutzer klickt auf diesen Menüeintrag, unser benutzerdefinierter Code wird aufgerufen, um nützliche Arbeit zu leisten, dann verschwinden alle Einträge aus dem Ergebnisbereich, der Bereich bleibt ausgewählt.

Ich habe versucht, zwei Variationen zu tun, um alle Ergebniselemente zu entfernen.

Variante 1 - es ruft IResultData::DeleteAllRsltItems(), die E_UNEXPECTED zurückgibt und Elemente werden nicht entfernt - sie bleiben einfach dort.

VAriation 2 - es ruft IResultData::DeleteItem() für jedes Element auf, das zuvor in das Ergebnisfenster eingefügt wurde. Jeder Anruf gibt erneut E_UNEXPECTED zurück und Elemente werden nicht entfernt.

Wie entferne ich alle Ergebniselemente ordnungsgemäß aus der MMC-Ansicht?

Antwort

0

Wir tun dies in der OnShow-Handler. Alle untergeordneten Elemente werden wie folgt entfernt:

CComPtr<IResultData> pResultData; 
result = pConsole->QueryInterface(IID_IResultData, (void **)&pResultData); 
assert(SUCCEEDED(result)); 
pResultData->DeleteAllRsltItems(); 

dann wieder hinzugefügt:

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); 

Dies funktioniert die Ergebnispositionen zu entfernen. Ich nehme an, dass Sie ein anderes Problem in dem Code haben, der das E_UNEXPECTED verursacht.