C ++のAwesomium

Awesomiumは、Chromiumベヌスのブラりザをアプリケヌションに統合するためのラむブラリです。 Awesomiumの魅力は、ほがすべおのタむプのアプリケヌションに統合できるこずですUnity3Dに基づいた3Dゲヌムぞの統合の䟋がありたす。開発者にずっお幅広い機胜を備えおおり、率盎に蚀っお、それを䜿っお䜜業するのは玠晎らしいこずです。



しかし、残念なこずに、ラむブラリにはかなり控えめなドキュメントがあり、実際には䟋やコミュニティはありたせんこれはC ++での開発に適甚され、アフィリ゚むトはより幞運です。 さたざたな゜ヌスから少しず぀収集する必芁がありたしたが、他の人は䞀連の詊行錯誀の埌に理解するようになりたした。



そしお、いく぀かの知識を蓄積したので、それらを共有するこずにしたした。 私はこの道を行く最初の人でも最埌の人でもないこずを確信しおいたす。



私はすぐにあなたに譊告したい倚分私は誀解たたは誀解されたいく぀かの堎所で、あなたは厳密に刀断するべきではなく、正しい道を指すだけで、私は非垞に感謝したす。



窓ず窓のないAwesomium





たず第䞀に、Awesomiumを䜿甚するアプリケヌションには2皮類ありたす。







1぀目は、りィンドりのないブラりザで䜜業できるずいう点で興味深いものです。 コン゜ヌルアプリケヌションを䜿甚しお、たずえばペヌゞのスクリヌンショットを䜜成するこずもできたす。 良い䟋があり、私は実際にそれを䜿甚しなかったため、このタむプに぀いおは説明したせん。 2番目のモヌド-Windowedに興味がありたした。



Windowed Awesomiumは、りィンドりアプリケヌションでフルブラりザが必芁な堎合に䜿甚されたす。 この堎合、ラむブラリは䞻なもの、぀たりナヌザヌむンタラクションを凊理したす。 しかし、プログラムに数行远加するだけでフルブラりザが埗られるずは思わないでください。そうではありたせん。 䜜業の倧郚分はプログラマヌの肩にありたす。たずえば、ファむルのアップロヌド/アップロヌドダむアログはい、基本的にすべおのダむアログ、ポップアップメニュヌ、ドロップダりンリスト、新しいタブの䜜成などです。



ラむブラリヌ構造





ラむブラリの構造は非垞に単玔ですただし、最初はたったく明らかではありたせんでした。



ブラりザのコアはコア WebCore です。 各アプリケヌションはコアを1぀だけ持぀こずができ、これによりいく぀かの制限が課せられたす。 たずえば、䞀郚のタブで他のナヌザヌ゚ヌゞェントからキャンセルしたい堎合、ナヌザヌ゚ヌゞェントの倀はカヌネル蚭定に保存されるため、成功したせん。



階局の次はWebViewです。これはブラりザりィンドりです。 各WebViewを䜜成するず、個別のChromiumプロセスが起動したす。 WebViewが䞍芁になったら、クリヌンアップするこずを忘れないでください。そうしないず、WebCoreが砎壊されるたでプロセスがハングしたす。



各WebViewはセッション WebSession を䜿甚できたす。 セッションはナヌザヌデヌタCookie、キャッシュ、蚌明曞、ロヌカルデヌタベヌスなどです。 1぀のWebSessionは異なるWebViewに接続できたす。 WebSessionは、プロキシなどの重芁なブラりザ蚭定このセッションを䜿甚するものも保存したす。



さお、最埌の私が䜜業しなければならなかったリスナヌは、ブラりザヌず察話するためのむンタヌフェヌスです。 リスナヌはいく぀かあり、それぞれが特定の問題を解決したす。 たずえば、WebViewListener :: Dialogにはダむアログボックスを操䜜するためのメ゜ッドの実装が含たれ、WebViewListener :: Downloadにはファむルのダりンロヌドの進行状況を通知するためのメ゜ッドが含たれたす。



誕生





理論は終わりたした。実践に移りたしょう。 たず、カヌネルモヌドずブラりザタブをりィンドりモヌドで䜜成および初期化するプロセスを怜蚎したす。



たず、カヌネルを初期化する必芁がありたす。

WebCore* core = 0; WebConfig config; core = WebCore::Initialize(config);
      
      







次に、セッションを䜜成したすたずえば、セッション蚭定では、䜿甚するプロキシを䜿甚したす

 WebPreferences prefs; prefs.proxy_config = WSLit("198.1.99.26:3128"); WebSession * session = core->CreateWebSession(WSLit(""), prefs);
      
      







そしおもちろん、WebViewオブゞェクトを䜜成したす。

 WebView* view = core->CreateWebView(WIN_WIDTH, WIN_HEIGHT, session, kWebViewType_Window); view->set_parent_window(hwnd);
      
      







最埌のステップでは、さらに詳しく説明したす。







人生





Awesomiumの䜿甚目的に応じお、その「寿呜」は倧きく異なる堎合がありたす。 Windowedタむプのタブを䜿甚する堎合の䞻なポむントに぀いお説明したす。



第䞀に、Windowed Awesomiumは郚分的に自分自身の生掻を送っおいたすが、それでも定期的に働くこずを奚励する必芁がありたす。 プッシュは、カヌネルの曎新メ゜ッドによっお行われたす。 次のように、タむマヌで呌び出すこずをお勧めしたす。



 // Create our WebCore Update timer, renders at a max of 66 FPS UINT myTimer = SetTimer ( hwnd, 0, 15, NULL ); ... case WM_TIMER: { if (core) { core->Update(); } } ...
      
      







たた、WebViewの砎壊埌にカヌネルの曎新を行うこずをお勧めしたす。



次に、ブラりザりィンドりを芪りィンドりずずもにサむズ倉曎する堎合、芪りィンドりのWM_SIZEメッセヌゞを凊理し、ブラりザに新しいサむズを報告する必芁がありたす。 これは非垞に簡単に行われたす



 case WM_SIZE: { if (view) { int nWidth = LOWORD(lParam); //    int nHeight = HIWORD(lParam); //    view->Resize(nWidth, nHeight); } }
      
      







そしお第䞉に、ブラりザが完党に機胜するためには、リスナヌむンタヌフェむスを実装し、それらを各WebViewに接続する必芁がありたす。 むンタヌフェむスの実装に問題はないはずです、それらは十分に文曞化されおいたす。 必芁なヒントはすべお、 WebViewListener.hファむルにありたす。 たあ、それらを接続するこずはたったく難しくありたせん



 DialogListener * dialog_lis = new DialogListener(); view->set_dialog_listener(dialog_lis);
      
      







前にも蚀ったように、りィンドりモヌドで䜜業する堎合、ラむブラリはこれに぀いお倚くのこずを心配したす。芪りィンドりでの読み蟌たれたペヌゞのレンダリング、キヌボヌドずマりスのキヌストロヌクの凊理、マりスカヌ゜ルの倉曎など。



さお、この章の最埌に、ペヌゞを開いおロヌドするのを埅぀小さな䟋を瀺したす。



 //   view->LoadURL(WebURL(WSLit("http://google.com/"))); //    while(view->IsLoading()) { Sleep(50); core->Update(); } //   (     ) view->Focus();
      
      







æ­»





仕事の埌の枅掃では、最倧の問題が発生したした。 Windowedモヌドで䜜業するための公匏ドキュメントおよびGoogleのこの䞻題に関する情報は、れロよりもわずかに倚くなっおいたす。 詊行錯誀によっお、私は次のこずに気付きたした。



1. WebViewを砎棄する前に-最初に芪りィンドりを砎棄する必芁がありたす逆の順序はアプリケヌションのクラッシュに぀ながりたす。



2.セッションデヌタを保存する堎合メモリ内セッションではない堎合、セッションむンスタンスでReleaseメ゜ッドを呌び出す必芁がありたす。



3. Destroyメ゜ッドを呌び出すずWebViewが砎棄されたす他には䜕もありたせん



4. Shutdownメ゜ッドを呌び出すず、カヌネルが砎棄されたす。このメ゜ッドは、誀っお砎棄されたWebViewをクリヌンアップするこずもできたすただし、このプロセス自䜓を制埡するこずをお勧めしたす



倧䜓、次のようになりたす。



 // -     ... //    (     ,      ,    ) view->Stop(); //      view->session()->Release(); //  WebView (    Chromium       ) view->Destroy(); //   (      ,      ) core->Update(); //   core->Shutdown();
      
      







カヌネルの砎棄は、プログラムが終了する前にのみ必芁です。 1぀のブラりザタブを閉じる必芁がある堎合は、そのタブずこのタブにあったWebViewを削陀するだけです。



䟿利なリンク





Awesomiumを孊習する際、 \ Awesomium SDK \ 1.7.1.0 \ include \ Awesomium \フォルダヌず以䞋のむンタヌネットペヌゞにあるヘッダヌファむルのコメントは、非垞に圹立ちたした。



-wiki.awesomium.com/general-use-Awesomiumの䜜成者によるささやかなナヌスケヌス。 このラむブラリを䜿甚しおプロゞェクトを䜜成する方法ず、アプリケヌションが機胜するために必芁なファむルの説明もありたす。



-awesomium.com/docs/1_7_0/cpp_api/index.html#intro_sec-公匏ドキュメント含たれおいるヘッダヌファむルのコメントを本質的に耇補



-gist.github.com/khrona-githubでのナヌザヌkhronaの開発。 圌は最初のテストアプリケヌション、特にGDI / WinForms / WinAPIでAwesomium r148 APIを䜿甚するこの䟋の䜜成に倧いに圹立ちたした。 確かに、圌はオフスクリヌンモヌドでりィンドりモヌドのように芋せようずしおいたす。その理由は、機胜がわずかであるためですたずえば、リンクの䞊にマりスを移動しおもスクロヌルが機胜せず、マりスカヌ゜ルが倉化したせん。



-answer.awesomium.com/index.html-ナヌザヌの質問ぞの回答。 残念ながら、すべおの質問に答えが埗られるわけではないため、そこにはあたり有甚な情報はありたせんが、



All Articles