3

ブラウザ コンポーネントを使用する Windows アプリケーションを作成する必要があります。RAD Studio の C++ Builder を選択したのは、過去に使用したことがあるからですが、Web 開発者ほど C++ プログラミングの経験がありません (主に JS、PHP などの Web 開発者です)。 ...)、そのため、プロジェクトの実現にいくつかの問題が発生しました。私は、C++ のプロのスペシャリストが考えたのと同じくらい迅速に解決できる、非常に基本的な何かが欠けていることを願っています。

組み込みの TWebBroswer コンポーネントには多くの欠点があるため、Chromium ( https://github.com/hgourvest/dcef3 ) を使用することにしました。それをインストールして、Delphi だけでなく C++ Builder でも動作させるには時間がかかりましたが、TChromium を使用したプロジェクトは、現時点ではコンパイルして正常に動作します。ページをナビゲートしたり、JS を実行したりできます。もっと。

それにもかかわらず、まだ解決できない問題が 1 つあります。それは、ドキュメントの DOM へのアクセスです。Google の検索結果では、何の役にも立ちませんでした。同じ問題があり、回答がない 1 つのトピック ( 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 ではありませんが、そのうちの 1 つを機能させることができれば、2 つ目は問題ないと思います): 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

私はこれと戦うのにとても疲れています。RAD Studio C++ Builder でこれらの VisitDom、ViewSource、およびその他のメソッドをすべて使用する方法について、経験豊富な方からアドバイスをいただけますか? Delpi では、かなり簡単です。

PSそれが何とか役立つなら、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};
};
4

0 に答える 0