CEFのブラウザプロセスとレンダリングプロセス間の通信
Communication Between Browser Process
https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage CEFが提供するブラウザとブラウザ間の通信のメカニズムについていくつか触れました。プロセスランタイムメッセージを試し、CefProcessMessageとCefBrowser :: SendProcessMessage()を使用しました。
にいる JSはCEFでC ++と相互作用します 基本的な手順を説明しながら、テキストに基づいてキーコードを示します。
Foruokオリジナル、転載が必要な場合は、foruokのWeChatサブスクリプション番号「ProgramVision」の連絡先foruokに注意してください。
-
- メッセージを送ります
CefBrowser :: SendProcessMessage()を使用してメッセージを送信します。 SendProcessMessageの最初のパラメーターはCefProcessIdであり、ブラウザープロセスに送信されます。 PID_BROWSERを使用してレンダリングプロセスに送信され、PID_RENDERERが使用されます。
レンダリングプロセスでメッセージを送信したコードは次のとおりです(ClientV8HandlerのExecuteメソッド内)。
CefRefPtr msg = CefProcessMessage::Create('login_msg') // Retrieve the argument list object. CefRefPtr args = msg->GetArgumentList() // Populate the argument values. args->SetSize(2) args->SetString(0, strUser) args->SetString(1, strPassword) // Send the process message to the browser process. CefV8Context::GetCurrentContext()->GetBrowser()->SendProcessMessage(PID_BROWSER, msg)
cef_js_integrationの例で受信したログインメッセージ(レンダリングプロセス)をブラウザプロセスに送信しました。
-
- メッセージの処理
ブラウザ側で、CefClient :: OnProcessMessageReceived()メソッドをオーバーライドして、クロスプロセスメッセージを処理します。
cef_js_integrationを例にとると、OnProcessMessageReceivedメソッドはClientHandlerでオーバーライドされます。
bool ClientHandler::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message){ const std::string& messageName = message->GetName() if (messageName == 'login_msg') { // extract message CefRefPtr args = message->GetArgumentList() CefString strUser = args->GetString(0) CefString strPassword = args->GetString(1) TCHAR szLog[256] = { 0 } _stprintf_s(szLog, 256, _T('BrowserProcess, user - %s, password - %s
'), strUser.c_str(), strPassword.c_str()) OutputDebugString(szLog) //send reply to render process CefRefPtr outMsg = CefProcessMessage::Create('login_reply') // Retrieve the argument list object. CefRefPtr replyArgs = outMsg->GetArgumentList() // Populate the argument values. replyArgs->SetSize(1) replyArgs->SetInt(0, 0) // Send the process message to the renderer process. browser->SendProcessMessage(PID_RENDERER, outMsg) return true } return false}
ご覧のとおり、上記のコードはレンダリングプロセスにメッセージを送信します。
レンダリングプロセス側で、CefRenderProcessHandler :: OnProcessMessageReceived()メソッドをオーバーライドして、ブラウザープロセスからのメッセージを処理します。特定のコードはClientAppRenderクラスにあります。
bool ClientAppRenderer::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message){ const std::string& messageName = message->GetName() if (messageName == 'login_reply') { // extract message CefRefPtr args = message->GetArgumentList() int status = args->GetInt(0) OutputDebugString(status == 0 ? _T('Renderer process, login ok
') : _T('Renderer process, login failed
')) CefRefPtr frame = browser->GetMainFrame() frame->ExecuteJavaScript('alert('Got Login Reply from Browser process')', frame->GetURL(), 0) return true } return false}
わかりました、これがプロセス全体です。
その他の参考記事:
- 構築するCEFWindows開発環境
- CEFはPPAPIプラグインをロードします
- VS2013は、最も単純なPPAPIプラグインをコンパイルします
- PPAPIの設計を理解する
- PPAPIプラグインとブラウザの相互作用プロセス
- WindowsでソースからCEFをコンパイルする
- PPAPImedia_stream_videoの例をコンパイルします
- PPAPIプラグインの描画と入力イベントの処理
- PPAPIプラグインでローカルウィンドウを作成します
- PPAPIプラグインとブラウザ通信
- WindowsでソースからSkiaをコンパイルする
- PPAPIプラグインでSkia描画を使用する
- DLLに画像リソースをロードして、SkiaでSkBitmapオブジェクトを生成します
- PPAPI + Skiaによって実現されたグラフィティボード
- PPAPIでのChromiumの3Dグラフィックインターフェイス
- PPAPIでOpenGLESを使用して描画する
- JSはCEFでC ++と相互作用します
次に、私の先生である神の人工知能チュートリアルを共有します。ゼロベース!わかりやすい!ユーモラス!黄色の段落も!私たちの人工知能チームにもぜひご参加ください。 https://blog.csdn.net/jiangjunshow