C ++ Builder — TChromium (RAD Studio, C ++ Builder): как использовать VisitDom и другие подобные методы?

Мне нужно написать приложение для Windows, которое использует компонент браузера в нем. Я выбрал R ++ Studio C ++ Builder, потому что уже использовал его в прошлом, однако, я не настолько опытен в программировании на C ++, как в web-dev (в основном я веб-разработчик: JS, PHP и т. Д. …), поэтому я столкнулся с некоторыми проблемами при реализации моего проекта. Надеюсь, мне не хватает чего-то очень простого, что специалист C ++ мог бы решить так быстро, как думал.

Встроенный компонент TWebBroswer имеет много недостатков, поэтому я принял решение использовать Chromium (https://github.com/hgourvest/dcef3). Потребовалось время, чтобы установить его и заставить его работать не только в Delphi, но и в C ++ Builder, однако, у меня есть проект с TChromium в форме, который на данный момент компилируется и работает отлично: я могу перемещаться по страницам, выполнять JS и больше.

тем не менее, есть одна проблема, которую я до сих пор не могу решить: доступ к DOM документа. В результатах поиска Google я не нашел ничего полезного: одна тема с той же проблемой и без ответов (http://www.cyberforum.ru/cpp-builder/thread996496.html) и документация.

В документации сказано, что я должен использовать метод VisitDom для этой цели, но я не знаю, как это сделать в C ++ Builder.

В этой демонстрации C ++: https://code.google.com/p/chromiumembedded/source/browse/trunk/cef3/tests/cefclient/dom_test.cpp?r=689 Я вижу следующий код:

class ClientDOMVisitor : public CefDOMVisitor {
public:
ClientDOMVisitor() {
}

virtual void Visit(CefRefPtr<CefDOMDocument> document) OVERRIDE {
// Register a click listener for the button.
CefRefPtr<CefDOMNode> button = document->GetElementById("button");
ASSERT(button.get());
button->AddEventListener("click", new ClientDOMEventListener(), false);
}

IMPLEMENT_REFCOUNTING(ClientDOMVisitor);
};

Затем в методе VisitDom:

VisitDOM(new ClientDOMVisitor)

Когда я пытаюсь скомпилировать этот фрагмент кода, возникают ошибки (в C ++ Builder), такие как:

[BCC32 Error] Unit1.cpp(184): E2303 Type name expected

Позже я попытался использовать советы из этой темы (не DOMVisitor — StringVisitor, но, думаю, если бы я мог заставить один из них работать, у меня не было бы проблем со вторым): https://groups.google.com/forum/#!msg/delphichromiumembedded/DckdcKOCLzw/-zgUXOUTXa4J Он написан на Delphi, поэтому я не уверен, правильно ли я перевел код на C ++.

В Unit1.h я добавил ICefStringVisitor к TForm1, как обсуждалось, и добавил метод Visit в раздел приватного объявления:

    class TForm1 : public TForm, ICefStringVisitor
{
__published:    // IDE-managed Components
// ... I've hide a part of code, nothing useful here ...
TChromium *Chromium1;
void __fastcall Chromium1BeforeBrowse(TObject *Sender, const ICefBrowser *browser,
const ICefFrame *frame, const ICefRequest *request, bool isRedirect,
bool Result);
void __fastcall Chromium1LoadEnd(TObject *Sender, const ICefBrowser *browser, const ICefFrame *frame,
int httpStatusCode);
private:    // User declarations
void __fastcall Visit(const UnicodeString str);
public:     // User declarations

__fastcall TForm1(TComponent* Owner);
};

В Unit1.cpp я добавил:

void __fastcall TForm1::Visit(const UnicodeString str)
{
ShowMessage(str);
}
void __fastcall TForm1::Chromium1LoadEnd(TObject *Sender, const ICefBrowser *browser, const ICefFrame *frame, int httpStatusCode)
{
ICefFrame * ncFrame = const_cast<ICefFrame *>(frame);
// doesn't compile without const_cast
ncFrame->GetSource(this);
}

Этот код компилируется и запускается, но я сразу получаю эту ошибку, и приложение завершает работу:

Pure virtual function called

Я так устал бороться с этим. Может кто-нибудь опытный совет мне, как использовать все эти VisitDom, ViewSource и другие методы в RAD Studio C ++ Builder? В Дельпи, как я вижу, это довольно просто.

Постскриптум Если это как-то поможет, в ceflib.hpp я нашел следующее объявление:

__interface ICefDomVisitor;
typedef System::DelphiInterface<ICefDomVisitor> _di_ICefDomVisitor;
__interface  INTERFACE_UUID("{8FD3D3A6-EA3A-4A72-8501-0276BD5C3D1D}") ICefFrame  : public ICefBase
{

public:
virtual bool __fastcall IsValid(void) = 0 ;
virtual void __fastcall Undo(void) = 0 ;
virtual void __fastcall Redo(void) = 0 ;
virtual void __fastcall Cut(void) = 0 ;
virtual void __fastcall Copy(void) = 0 ;
virtual void __fastcall Paste(void) = 0 ;
virtual void __fastcall Del(void) = 0 ;
virtual void __fastcall SelectAll(void) = 0 ;
virtual void __fastcall ViewSource(void) = 0 ;
virtual void __fastcall GetSource(const _di_ICefStringVisitor visitor) = 0 ;
virtual void __fastcall GetSourceProc(const _di_TCefStringVisitorProc proc) = 0 ;
virtual void __fastcall GetText(const _di_ICefStringVisitor visitor) = 0 ;
virtual void __fastcall GetTextProc(const _di_TCefStringVisitorProc proc) = 0 ;
virtual void __fastcall LoadRequest(const _di_ICefRequest request) = 0 ;
virtual void __fastcall LoadUrl(const ustring url) = 0 ;
virtual void __fastcall LoadString(const ustring str, const ustring url) = 0 ;
virtual void __fastcall ExecuteJavaScript(const ustring code, const ustring scriptUrl, int startLine) = 0 ;
virtual bool __fastcall IsMain(void) = 0 ;
virtual bool __fastcall IsFocused(void) = 0 ;
virtual ustring __fastcall GetName(void) = 0 ;
virtual __int64 __fastcall GetIdentifier(void) = 0 ;
virtual _di_ICefFrame __fastcall GetParent(void) = 0 ;
virtual ustring __fastcall GetUrl(void) = 0 ;
virtual _di_ICefBrowser __fastcall GetBrowser(void) = 0 ;
virtual _di_ICefv8Context __fastcall GetV8Context(void) = 0 ;
virtual void __fastcall VisitDom(const _di_ICefDomVisitor visitor) = 0 ;
virtual void __fastcall VisitDomProc(const _di_TCefDomVisitorProc proc) = 0 ;
__property ustring Name = {read=GetName};
__property ustring Url = {read=GetUrl};
__property _di_ICefBrowser Browser = {read=GetBrowser};
__property _di_ICefFrame Parent = {read=GetParent};
};

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]