2011-05-13 178 views
1

我有一种情况,我想通过IE9附带的IHTMLDocument7接口使用一些方法。特别是getElementsByTagNameNS()方法,因为我想使用特定的标记类型(比解析整个文档要容易得多)。有没有办法使用TCppWebBrowser从C++ Builder(或Delphi)最新的IE9 MSHTML接口?

我当前的代码如下所示:

IHTMLDocument2* doc = NULL; 

    if (browser->ControlInterface->Document) // make sure TCppWebBrowser is OK 
    { 
     if (SUCCEEDED(browser->ControlInterface->Document->QueryInterface(IID_IHTMLDocument2, (void**)&doc))) 
     { 
      IHTMLElement* body; 

      HRESULT hr = doc->get_body(&body); 
      if (SUCCEEDED(hr)) 
      { 
       WideString innerHtml; 
       body->get_innerHTML(&innerHtml); 
       txtInfo->Text = innerHtml; 

       body->Release(); 
      } 

      doc->Release(); 
     } 
    } 

这工作,并可能有问题,但我最感兴趣的是得到我现在想要的功能。

如果我改变了代码,使用与IE9中的新界面:

browser->ControlInterface->Document->QueryInterface(IID_IHTMLDocument7, (void**)&doc) 

我得到以下编译器错误:

[BCC32 Error] Unit2.cpp(134): E2451 Undefined symbol 'IID_IHTMLDocument7' 
    Full parser context 
    Unit2.cpp(129): parsing: void _fastcall TForm2::Button4Click(TObject *) 

[BCC32 Error] Unit2.cpp(134): E2285 Could not find a match for 'IUnknown::QueryInterface(undefined,void * *)' 
    Full parser context 
    Unit2.cpp(129): parsing: void _fastcall TForm2::Button4Click(TObject *) 

看来,它无法找到该界面匹配。

  • 我应该怎么做才能使这个 接口可用?我猜 与BCB 一起发货的Windows SDK版本可能已过时,或不知道有关IE9 版本的MSHTML的类型库的 。
  • 有没有办法来 做出相应的头文件 提供此接口 (IID_IHTMLDocument7),并保持 TCppWebBrowserControl?或者我需要 导入一个单独的ActiveX控件?

我在使用IE9的Windows 7(x64)上使用C++ Builder Starter XE(15.0.3953.35171)。

回答

1

至少在C++ Builder 2010中,IHTMLDocument7未在mshtml.h中定义,但是IHTMLDocument6是。如果您从Microsoft下载最新的SDK,则可以将IHTMLDocument7定义直接复制到现有代码中。

或者,尝试查看BCCSDK是否已更新为支持IHTMLDocument7。

3

使用IHTMLDocument3 Interface代替IHTMLDocument7,或执行JavaScript来回报你需要的东西,如:

IHTMLDocument2 *doc = NULL; 
IHTMLWindow2 *win; 

if(SUCCEEDED(CppWebBrowser->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&doc))) { 
    HRESULT hr = doc->get_parentWindow(&win); 
    if (SUCCEEDED(hr)) { 
     BSTR cmd = L"function deltag(){\ 
    var all = this.document.getElementsByTagNameNS('IMG'); \ 
    var images = [];       \ 
    for(var a=0;a<all.length;++a)    \ 
    {           \ 
     if(all[a].tagName == 'NAME')   \ 
      images.push(all[a]);   \ 
    }            \ 
    for(var i=0;i<images.length;++i)    \ 
    {            \ 
     images[i].parentNode.removeChild(images[i]); \ 
    } " ;   \       

    VARIANT v; 
    VariantInit(&v); 
    win->execScript(cmd,NULL,&v); 
    VariantClear(&v); 
    win->Release(); 
    } 
    doc->Release(); 
    } 
相关问题