Есть ли способ использовать новейшие интерфейсы IE9 MSHTML из C ++ Builder (или Delphi) с TCppWebBrowser? - PullRequest
1 голос
/ 13 мая 2011

У меня есть ситуация, когда я хотел бы использовать некоторые методы, доступные через интерфейс IHTMLDocument7 , поставляемый с IE9. В частности, метод getElementsByTagNameNS (), потому что я хочу работать с определенными типами тегов (намного проще, чем анализировать весь документ).

Мой текущий код выглядит так:

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 *)

Похоже, он не может найти соответствие для этого интерфейса.

  • Что я должен сделать, чтобы сделать это интерфейс доступен? Я угадываю Версия Windows SDK поставляется с BCB может быть устаревшим или не знает о библиотеке типов для IE9 версия MSHTML.
  • Есть ли способ сделать соответствующие заголовки доступно для этого интерфейса (IID_IHTMLDocument7) и сохраните TCppWebBrowserControl? Или мне нужно импортировать отдельный элемент управления ActiveX?

Я использую C ++ Builder Starter XE (15.0.3953.35171) в Windows 7 (x64) с IE9.

Ответы [ 3 ]

3 голосов
/ 01 октября 2011

Используйте Интерфейс IHTMLDocument3 вместо 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();
  }
1 голос
/ 24 мая 2011

По крайней мере в C ++ Builder 2010, IHTMLDocument7 не определен в mshtml.h, но IHTMLDocument6 есть. Если вы загружаете обновленный SDK от Microsoft, вы можете скопировать определение IHTMLDocument7 непосредственно в существующий код.

В качестве альтернативы попробуйте посмотреть, обновлен ли BCCSDK для поддержки IHTMLDocument7.

1 голос
/ 14 мая 2011

Заголовки IE9 доступны для скачивания на http://msdn.microsoft.com/en-us/ie/aa740471

Я не уверен, сколько лет вашему компоновщику BCB.Для компоновщика VC 2005 требуется KB949009 исправление для связи с библиотеками IE9 в конфигурации отладки.

...