【问题标题】:How to load html contents from stream and then how to create style sheet to display the html file in preview pane (like HTML preview handler)如何从流中加载 html 内容,然后如何创建样式表以在预览窗格中显示 html 文件(如 HTML 预览处理程序)
【发布时间】:2013-07-28 09:35:18
【问题描述】:

我正在开发一个 Visual c++ 应用程序,我必须为预览窗格中的 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 文件时,如果我们单击它,我们可以在预览窗格中看到 html 文件预览。我也想做同样的事情。为此,我们需要将 html 文件内容存储在某个位置(在我的情况下,我有 _FinalHTMLStream)。对于对 XML 文件执行相同操作,代码如上,但我不知道如何对 html 文件执行此操作。所以这就是我想要的。现在明白了吗??如果没有,请告诉我??

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

【问题讨论】:

    标签: c++ html html-parsing domdocument ihtmldocument


    【解决方案1】:

    我终于能够自己显示 Html 内容(无法从互联网和 stackoverflow 获得任何帮助,但我想在 stackoverflow 上提供代码,以便将来对做同样事情的人有所帮助)我有使用 IHTMLDocument2 接口和 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%。

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多