IUnknownPtr GenericCLRLoader::WSCoCreateDotNetInstancePtr(const CLSID& clsid) { LPOLESTR szClsid; HRESULT hr = StringFromCLSID(clsid, &szClsid); if (FAILED(hr)) throw _com_error(hr); ATL::CString sClsid = szClsid; CoTaskMemFree(szClsid); CRegKey rkCLSID; hr = rkCLSID.Open(HKEY_CLASSES_ROOT, L"CLSID\\" + sClsid + L"\\InprocServer32", KEY_READ); if (hr != ERROR_SUCCESS) throw _com_error(HRESULT_FROM_WIN32(hr)); ATL::CString sAssembly = GetStringValue(rkCLSID, L"Assembly"); ATL::CString sClass = GetStringValue(rkCLSID, L"Class"); ATL::CString sCodeBase = GetStringValue(rkCLSID, L"CodeBase"); if (sAssembly.GetLength() == 0 || sClass.GetLength() == 0 || sCodeBase.GetLength() == 0) throw _com_error(REGDB_E_CLASSNOTREG); ATL::CString dllPath; ATL::CString strFilePrefix(_T("file:///")); if (sCodeBase.Left(strFilePrefix.GetLength()).MakeLower() == strFilePrefix) { dllPath = sCodeBase.Mid(strFilePrefix.GetLength()); // discard 'file:///' } else { dllPath = sCodeBase; } IUnknownPtr result; hr = TheInstance()->CreateCOMObject(dllPath, sAssembly, sClass, &result); if (FAILED(hr)) throw _com_error(hr); return result; }
bool CFilterElementHide::IsMatchFilterElementHide(IHTMLElement* pEl) const { HRESULT hr; if (!m_tagId.IsEmpty()) { CComBSTR id; hr = pEl->get_id(&id); if ((hr != S_OK) || (id != CComBSTR(m_tagId))) { return false; } } if (!m_tagClassName.IsEmpty()) { CComBSTR classNameBSTR; hr = pEl->get_className(&classNameBSTR); if (hr == S_OK) { CString className = classNameBSTR; int start = 0; CString specificClass; bool foundMatch = false; while ((specificClass = className.Tokenize(L" ", start)) != L"") { // TODO: Consider case of multiple classes. (m_tagClassName can be something like "foo.bar") if (specificClass == m_tagClassName) { foundMatch = true; } } if (!foundMatch) { return false; } } } if (!m_tag.IsEmpty()) { CComBSTR tagName; hr = pEl->get_tagName(&tagName); tagName.ToLower(); if ((hr != S_OK) || (tagName != CComBSTR(m_tag))) { return false; } } // Check attributes for (std::vector<CFilterElementHideAttrSelector>::const_iterator attrIt = m_attributeSelectors.begin(); attrIt != m_attributeSelectors.end(); ++ attrIt) { ATL::CString value; bool attrFound = false; if (attrIt->m_type == CFilterElementHideAttrType::STYLE) { CComPtr<IHTMLStyle> pStyle; if (SUCCEEDED(pEl->get_style(&pStyle)) && pStyle) { CComBSTR bstrStyle; if (SUCCEEDED(pStyle->get_cssText(&bstrStyle)) && bstrStyle) { value = bstrStyle; value.MakeLower(); attrFound = true; } } } else if (attrIt->m_type == CFilterElementHideAttrType::CLASS) { CComBSTR bstrClassNames; if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames) { value = bstrClassNames; attrFound = true; } } else if (attrIt->m_type == CFilterElementHideAttrType::ID) { CComBSTR bstrId; if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId) { value = bstrId; attrFound = true; } } else { auto attributeValue = GetHtmlElementAttribute(*pEl, attrIt->m_bstrAttr); if (attrFound = attributeValue.isAttributeFound) { value = ToCString(attributeValue.attributeValue); } } if (attrFound) { if (attrIt->m_pos == CFilterElementHideAttrPos::EXACT) { // TODO: IE rearranges the style attribute completely. Figure out if anything can be done about it. if (value != attrIt->m_value) return false; } else if (attrIt->m_pos == CFilterElementHideAttrPos::STARTING) { if (value.Left(attrIt->m_value.GetLength()) != attrIt->m_value) return false; } else if (attrIt->m_pos == CFilterElementHideAttrPos::ENDING) { if (value.Right(attrIt->m_value.GetLength()) != attrIt->m_value) return false; } else if (attrIt->m_pos == CFilterElementHideAttrPos::ANYWHERE) { if (value.Find(attrIt->m_value) < 0) return false; } else if (attrIt->m_value.IsEmpty()) { return true; } } else { return false; } } if (m_predecessor) { CComPtr<IHTMLElement> pDomPredecessor; HRESULT hr = S_FALSE; switch (m_predecessor->m_type) { case ETraverserComplexType::TRAVERSER_TYPE_PARENT: hr = pEl->get_parentElement(&pDomPredecessor); break; case ETraverserComplexType::TRAVERSER_TYPE_IMMEDIATE: hr = S_FALSE; CComQIPtr<IHTMLDOMNode> pPrevSiblingNode = pEl; long type = 0; while (pPrevSiblingNode && type != 1) { IHTMLDOMNode* tmpNode; pPrevSiblingNode->get_previousSibling(&tmpNode); pPrevSiblingNode.Attach(tmpNode); if (pPrevSiblingNode) { hr = pPrevSiblingNode->get_nodeType(&type); if (hr != S_OK) pPrevSiblingNode.Release(); } } if (pPrevSiblingNode) hr = pPrevSiblingNode.QueryInterface(&pDomPredecessor); else return false; break; } if (hr != S_OK) return false; return m_predecessor->IsMatchFilterElementHide(pDomPredecessor); } return true; }