c++ - 如何从流中加载 html 内容,然后如何创建样式表以在预览 Pane 中显示 html 文件(如 HTML 预览处理程序)

标签 c++ html html-parsing domdocument ihtmldocument

我正在开发一个 Visual C++ 应用程序,我必须为预览 Pane 中的 HTML 预览开发预览处理程序。我有想法对 Xml 文档执行相同的操作(对于 xml 文件,他们创建样式表来完成此任务),但我不知道如何对 .html 文件执行此操作。

如果我是对的,那么我必须做这样的事情-

IHTMLDocument * pDomDoc;
HRESULT hr = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, 
                                  IID_IHTMLDocument2, (void**)&pDomDoc);
 I don't know what after that ?? 

有什么想法吗?

我的意思是我知道如何对 XML 文件执行此操作,如下所示 -

        IXMLDOMDocument *pDomDoc;
    IStream *m_FinalXMLStream;
             HRESULT hr = CoCreateInstance(__uuidof(DOMDocument60), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDomDoc));



                 if (SUCCEEDED(hr))
                    {
                        VARIANT_BOOL vfSuccess = VARIANT_FALSE;
                        VARIANT vtXmlSource = {0};
                        V_VT(&vtXmlSource) = VT_UNKNOWN;
                        V_UNKNOWN(&vtXmlSource) = static_cast<IUnknown *>(m_FinalXMLStream);
    //here m_FinalXMLStream is the stream cpntaining the contents of XML file
                        hr = pDomDoc->load(vtXmlSource, &vfSuccess);
                        if (vfSuccess != VARIANT_TRUE)
                        {
                            hr = FAILED(hr) ? hr : E_FAIL; // keep failed hr
                        }

                        if (SUCCEEDED(hr))
                        {
                            if ((m_pStyleSheetNode) == NULL)
                            {
                                hr = CreateStyleSheetNode();
//This function creates the stylesheet and defined somewhere in my code.
                            }

                            if (SUCCEEDED(hr))
                            {
                                BSTR bstrRtf;
                                hr  = pDomDoc->transformNode((m_pStyleSheetNode), &bstrRtf);
                                if (SUCCEEDED(hr))
                                {
                                    hr = CreatePreviewWindowForXml(bstrRtf);
//This function call creates the  window dimension where to preview the Xml contents
                                    SysFreeString(bstrRtf);
                                }
                            }
                        }
                        pDomDoc->Release();
                    }

知道如何对 html 文件执行相同的操作吗? ?我想对 HTML 文件做同样类型的事情。明白了???如果没有请再问我一次??

看到这个就明白我到底想做什么- 我想要做的是我有一个包含任何 html 文件内容的流(IStream *m_FinalHTMLStream;)。我如何获得流现在不是问题。现在重要的是它包含 html 文件的内容(如果您在记事本中打开任何 html 文件 - _FinalHTMLStream 内部包含相同的内容)。现在如您所见当我们在窗口资源管理器中有一个 html 文件时,如果我们单击它,我们可以在预览 Pane 中看到 html 文件预览。我想做同样的事情。为此,我们需要将 html 文件内容存储在某个位置(在我的例子中,我在 _FinalHTMLStream 中)。要对 XML 文件执行相同的操作,代码如上,但我不知道如何对 html 文件执行此操作。这就是我想要的。现在明白了?如果不明白,请告诉我?

我正在创建自己的预览处理程序 hor .html 文件,这就是我正在做的事情(简短而精确)..

最佳答案

最后,我已经能够自己显示 Html 内容(无法从互联网和 stackoverflow 获得任何帮助,但我想在 stackoverflow 上提供代码,以便将来对做同样事情的人有帮助)我有使用 IHTMLDocument2 接口(interface)、IPersistStreamInit、IMarkupContainer 和 IMarkupPointer 完成此操作。

代码如下-

            IHTMLDocument2  * pDoc=NULL;
            HRESULT hr = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, 
                                      IID_IHTMLDocument2, (LPVOID *) &pDoc);

                    if (pDoc)
                    {
                        IPersistStreamInit *pPersist = NULL;
                        pDoc->QueryInterface(IID_IPersistStreamInit,(LPVOID *) &pPersist);
                         if (pPersist)
                         {
                             IMarkupServices *pMS = NULL;
                             pPersist->InitNew();
                             pPersist->Release();
                             pDoc->QueryInterface(IID_IMarkupServices,(LPVOID *) &pMS);
                              if (pMS)
                              {
                                  IMarkupContainer *pMC = NULL;
                                  IMarkupPointer *pMkStart = NULL;
                                  IMarkupPointer *pMkFinish = NULL;
                                  pMS->CreateMarkupPointer(&pMkStart);
                                  pMS->CreateMarkupPointer(&pMkFinish);
                                  pMS->ParseString("you can see the syntax on msdn i don't want to give a spoon feed");
                                  if (pMC)
                                  {
                                      IHTMLDocument2 *pNewDoc = NULL;
                                      pMC->QueryInterface(IID_IHTMLDocument,(LPVOID *) &pNewDoc);
                                      if (pNewDoc)
                                      {
                                          IHTMLElement *pBody;
                                          pNewDoc->get_body(&pBody);
                                           if (pBody)
                                           {
                                               BSTR strText;
                                               pBody->get_innerText(&strText);
                                               hr = instance->CreatePreviewWindowForHtml(strText);
//this function is responsible for creating the preview at preview pane i have created it
// myself and passed the html contents which are converted to strText and is of the type BSTR .
                                               SysFreeString(strText);
                                               pBody->Release();

                                           }
                                           pNewDoc->Release();
                                      }
                                      pMC->Release();
                                  }
                                  if (pMkStart)
                                      pMkStart->Release();
                                  if (pMkFinish)
                                      pMkFinish->Release();
                                  pMS->Release();
                                         pMS->Release();
                              }
                         }
                         pDoc->Release();
                    }


                    return true;


    }

我希望这对某人非常有用。它会给出要做的想法,但我不想提供勺子饲料,所以评论了一些部分,但它是解决方案的 80%。

关于c++ - 如何从流中加载 html 内容,然后如何创建样式表以在预览 Pane 中显示 html 文件(如 HTML 预览处理程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17909747/

相关文章:

php - 在 PHP 中使用 preg_replace 时如何获得匹配项?

c++ - 四舍五入到最大 N 位小数

c++ - 如何在 std::unordered_set 上使用 boost::range::adaptors::transformed?

c++ - 为什么第一 block 代码产生垃圾值,而第二 block 代码将类成员的值相加?

javascript - 如何在传单中的标记下方添加文本?

java - 在java中解析html以提取信息

c++ - 在 1_54 中破坏了 boost 变体?

html - 如何在带有 id 修饰符的 ul 中选择一个 li?

html - 如何使用 Bootstrap 制作带有背景图像的 div 全屏

vba - 在 VBA 中解析 HTML 内容