void WinLauncher::showLastVisitedSites(IWebView& webView) { HMENU menu = ::GetMenu(m_hMainWnd); _com_ptr_t<_com_IIID<IWebBackForwardList, &__uuidof(IWebBackForwardList)>> backForwardList; HRESULT hr = webView.backForwardList(&backForwardList.GetInterfacePtr()); if (FAILED(hr)) return; int capacity = 0; hr = backForwardList->capacity(&capacity); if (FAILED(hr)) return; int backCount = 0; hr = backForwardList->backListCount(&backCount); if (FAILED(hr)) return; UINT backSetting = MF_BYCOMMAND | (backCount) ? MF_ENABLED : MF_DISABLED; ::EnableMenuItem(menu, IDM_HISTORY_BACKWARD, backSetting); int forwardCount = 0; hr = backForwardList->forwardListCount(&forwardCount); if (FAILED(hr)) return; UINT forwardSetting = MF_BYCOMMAND | (forwardCount) ? MF_ENABLED : MF_DISABLED; ::EnableMenuItem(menu, IDM_HISTORY_FORWARD, forwardSetting); IWebHistoryItemPtr currentItem; hr = backForwardList->currentItem(¤tItem.GetInterfacePtr()); if (FAILED(hr)) return; hr = m_webHistory->addItems(1, ¤tItem.GetInterfacePtr()); if (FAILED(hr)) return; _com_ptr_t<_com_IIID<IWebHistoryPrivate, &__uuidof(IWebHistoryPrivate)>> webHistory; hr = m_webHistory->QueryInterface(IID_IWebHistoryPrivate, reinterpret_cast<void**>(&webHistory.GetInterfacePtr())); if (FAILED(hr)) return; int totalListCount = 0; hr = webHistory->allItems(&totalListCount, 0); if (FAILED(hr)) return; m_historyItems.resize(totalListCount); std::vector<IWebHistoryItem*> historyToLoad(totalListCount); hr = webHistory->allItems(&totalListCount, historyToLoad.data()); if (FAILED(hr)) return; size_t i = 0; for (auto& cur : historyToLoad) { m_historyItems[i].Attach(cur); ++i; } int allItemsOffset = 0; if (totalListCount > maxHistorySize) allItemsOffset = totalListCount - maxHistorySize; int currentHistoryItem = 0; for (int i = 0; i < totalListCount; ++i) { updateMenuItemForHistoryItem(menu, *(m_historyItems[allItemsOffset + currentHistoryItem]), currentHistoryItem); ++currentHistoryItem; } // Hide any history we aren't using yet. for (int i = currentHistoryItem; i < maxHistorySize; ++i) ::EnableMenuItem(menu, IDM_HISTORY_LINK0 + i, MF_BYCOMMAND | MF_DISABLED); }