HRESULT CMultimediaExemplarObject::InstallHostExtensions(IModule* pModule) { AFX_MANAGE_STATE(AfxGetStaticModuleState()) HRESULT hr = S_OK; CComPtr<IThing> pHostEx; CComBSTR bstrName; CComBSTR bstrNameInternal; CComPtr<IPropertyList> pMenu; CComPtr<IPropertyList> pPeerMenu; CComPtr<IMenuItem> pMenuItem; hr = m_pWorld->get_Exemplar(CComBSTR("Host"), &pHostEx); // Delete the peer menu, the current peer menu, which won't have MM additions (Approach...) hr = pHostEx->RemoveProperty(CComBSTR("PeerMenu")); if (FAILED(hr)) { VWTRACE(m_pWorld, "VWMM", VWT_ERROR, "CMultimediaExemplarObject::InstallHostExtensions Unable to remove peer menu, hr = %x\n", hr); goto ERROR_ENCOUNTERED; } // Now re-get the menu (this will get the avatar MM version) and re-add LogOff hr = pHostEx->get_ObjectProperty(CComBSTR("PeerMenu"), (IObjectProperty**) &pPeerMenu); if (FAILED(hr)) goto ERROR_ENCOUNTERED; // make a copy (since not COPYONGET) hr = CreateMenu(m_pWorld, &pMenu); if (FAILED(hr)) goto ERROR_ENCOUNTERED; hr = pPeerMenu->CopyTo(pMenu); if (FAILED(hr)) goto ERROR_ENCOUNTERED; // Add Log off... to peer menu list hr = CreateMenuItemExt( m_pWorld, CComBSTR("Log off..."), 0, NULL, CComBSTR("UpdateIsAvatarAndNotWizard"), CComBSTR("ShowLogOffDialog"), NULL, &pMenuItem); if (FAILED(hr)) goto ERROR_ENCOUNTERED; // pMenuItem->put_SortOrder(MI_SORT_PRIMARY+110); hr = pMenuItem->put_AddTargetParameter(VARIANT_TRUE); if (FAILED(hr)) goto ERROR_ENCOUNTERED; hr = pMenu->AddObjectProperty(pMenuItem); if (FAILED(hr)) goto ERROR_ENCOUNTERED; hr = pHostEx->put_ObjectProperty(CComBSTR("PeerMenu"), pMenu); ERROR_ENCOUNTERED: if (hr != S_OK) VWTRACE(m_pWorld, "VWMM", VWT_ERROR, "CMultimediaExemplarObject::Install Error encountered\n"); return hr; }