CEF(Chromium Embedded Framework)進程間通訊


3.3     CEF進程間通訊

3.3.1     進程間通訊函數

3.3.2     進程通訊實例

3.3.3       CEF指定frame通訊

 

3.3  CEF進程間通訊

3.3.1         進程間通訊函數

CEF有Browser進程和Renderer進程,進程之間可以相互通信。

發送消息Browser進程和Renderer進程都是一樣的,使用CefBrowser::SendProcessMessage() ,SendProcessMessage第一個參數是CefProcessId,是一個枚舉類型,給Browser進程發送,就用PID_BROWSER,給Render進程發送,就用PID_RENDERER。

typedef enum {

  ///

  // Browser process.

  ///

  PID_BROWSER,

  ///

  // Renderer process.

  ///

  PID_RENDERER,

} cef_process_id_t;

Render進程這邊, 重寫CefRenderProcessHandler::OnProcessMessageReceived()

Browser進程這邊,重寫CefClient::OnProcessMessageReceived()這個方法來處理跨進程消息。

3.3.2         進程通訊實例

(1)renderer進程發送消息

        CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create("login_msg");

 

        // Retrieve the argument list object.

        CefRefPtr<CefListValue> 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);

(2)Browser進程這邊,重寫CefClient::OnProcessMessageReceived()這個方法來處理跨進程消息。接收到消息之后再回復消息。

bool ClientHandler::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,

    CefProcessId source_process,

    CefRefPtr<CefProcessMessage> message)

{

    const std::string& messageName = message->GetName();

    if (messageName == "login_msg")

    {  

        // extract message

        CefRefPtr<CefListValue> 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\r\n"), strUser.c_str(), strPassword.c_str());

        OutputDebugString(szLog);

 

        //send reply to render process

        CefRefPtr<CefProcessMessage> outMsg = CefProcessMessage::Create("login_reply");

 

        // Retrieve the argument list object.

        CefRefPtr<CefListValue> 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;

}

(3)Render進程這邊, 重寫CefRenderProcessHandler:: OnProcessMessageReceived()方法來處理來自Browser進程的消息。

bool ClientAppRenderer::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,

    CefProcessId source_process,

    CefRefPtr<CefProcessMessage> message)

{

    const std::string& messageName = message->GetName();

    if (messageName == "login_reply")

    {

        // extract message

        CefRefPtr<CefListValue> args = message->GetArgumentList();

        int status = args->GetInt(0);

        OutputDebugString(status == 0 ? _T("Renderer process, login ok\r\n") : _T("Renderer process, login failed\r\n"));

        CefRefPtr<CefFrame> frame = browser->GetMainFrame();

        frame->ExecuteJavaScript("alert('Got Login Reply from Browser process')", frame->GetURL(), 0);

        return true;

    }

    return false;

}       

3.3.3         CEF指定frame通訊

一個網頁有多個frame,有一個mainframe和多個subframe,發送消息時,將frame的id放入參數中一起發過去,接收時消息時,獲取frameid,就可以實現指定frame通訊。因為frameid是一個int64類型的數據,所以發送時將它分解為兩個int32

的高低位數據,接收數據時,再將兩個int32的數據拼接成一個int64數據。

#define MAKE_INT64(int_low, int_high) \

    ((int64) (((int) (int_low)) | ((int64) ((int) (int_high))) << 32))

#define LOW_INT(int64_val) ((int) (int64_val))

#define HIGH_INT(int64_val) ((int) (((int64) (int64_val) >> 32) & 0xFFFFFFFFL))

 

// Sending the frame ID.

const int64 frame_id = frame->GetIdentifier();

args->SetInt(0, LOW_INT(frame_id));

args->SetInt(1, HIGH_INT(frame_id));

 

// Receiving the frame ID.

const int64 frame_id = MAKE_INT64(args->GetInt(0), args->GetInt(1));

CefRefPtr<CefFrame> frame = browser->GetFrame(frame_id);

自己開發了一個股票智能分析軟件,功能很強大,需要的點擊下面的鏈接獲取:

https://www.cnblogs.com/bclshuai/p/11380657.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM