libcef调试render进程

这篇文章的前提你的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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章