这篇文章的前提你的libcef能够正常启动,能打开一个基本的网页,但是不清楚一些接口怎样在render进程调用和调试的人来说的。
第一步,实现“CefRenderProcessHandler”接口,关键代码:
class ClientApp : public CefApp,
public CefRenderProcessHandler{
public:
ClientApp();
// CefApp methods:
virtual CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler()
OVERRIDE { return this; }
virtual void OnWebKitInitialized()OVERRIDE;
}
第二步,初始化libcef的时候创建render进程:
CefMainArgs mainArgs;
CefSettings settings;
CefRefPtr<CefApp> app;
settings.multi_threaded_message_loop = true;
settings.log_severity = LOGSEVERITY_DISABLE;
CefString(&settings.locale).FromWString(L"zh-CN");
void* sandbox_info = NULL;
CefRefPtr<ClientApp> CefApp(new ClientApp);
int exit_code = CefExecuteProcess(mainArgs, CefApp, sandbox_info);
bool lbRet = CefInitialize(mainArgs, settings, app, NULL);
第三步,给工程项目添加启动的命令参数“--renderer-startup-dialog”:
第四步,在“ClientApp::OnWebKitInitialized”实现的接口中下断点,启动的调试,程序运行后会弹出对话框,然后根据对话框提示找到进出id,然后附加调试:
到了这里ClientApp实现的CefRenderProcessHandler接口就可以进行断点调试了。另外,如果你需要Browser进程和render进程进行通信,则可以通过发送消息的方式,以下是Browser进程发送消息到render进程:
CefRefPtr<CefProcessMessage> msg= CefProcessMessage::Create("my_message");
CefRefPtr<CefListValue> args = msg->GetArgumentList();
args->SetString(0, "my string");
args->SetInt(0, 10);
(CefRefPtr<CefBrowser>)browser_->SendProcessMessage(PID_RENDERER, msg);
然后在render进程就要实现“OnProcessMessageReceived”接口了:
bool ClientApp::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message)
{
CEF_REQUIRE_RENDERER_THREAD()
const std::string& message_name = message->GetName();
if (message_name == "my_message") {
// Handle the message here...
return true;
}
return false;
}