cef js返回c++的代码_CEF中JavaScript与C++交互

本文详细介绍了CEF框架下JavaScript与C++交互的两种方法:通过Window bindings和js扩展。首先分析了Browser与Render进程的区别,然后通过代码示例展示了如何在Renderer进程中通过CefRenderProcessHandler的OnContextCreated()方法绑定JS函数到window对象,以及通过OnWebKitInitialized()方法注册JS扩展。此外,还提供了一个名为cef_js_integration的演示项目,包含了多种JS交互方式的实现。
摘要由CSDN通过智能技术生成

foruok原创。如需转载请关注foruok的微信订阅号“程序视界”联系foruok。

在贴代码之前。先来看看Browser进程和Render进程是怎么回事儿。有什么不同。

Browser与Render进程

从cefsimple開始吧,cefsimple_win.cc中的wWinMain函数中调用了CefExecuteProcess()方法来检測是否要启动其他的子进程。此处的CefExecuteProcess是在libcef_dll_wrapper.cc中的,它内部又调用了cef_execute_process方法(libcef_dll.cc),cef_execute_process又调用了libcef/browser/context.cc文件内实现的CefExecuteProcess方法。这种方法代码例如以下:

int CefExecuteProcess(const CefMainArgs& args,

CefRefPtr application,

void* windows_sandbox_info) {

base::CommandLine command_line(base::CommandLine::NO_PROGRAM);

#if defined(OS_WIN)

command_line.ParseFromString(::GetCommandLineW());

#else

command_line.InitFromArgv(args.argc, args.argv);

#endif

// Wait for the debugger as early in process initialization as possible.

if (command_line.HasSwitch(switches::kWaitForDebugger))

base::debug::WaitForDebugger(60, true);

// If no process type is specified then it represents the browser process and

// we do nothing.

std::string process_type =

command_line.GetSwitchValueASCII(switches::kProcessType);

if (process_type.empty())

return -1;

CefMainDelegate main_delegate(application);

// Execute the secondary process.

#if defined(OS_WIN)

sandbox::SandboxInterfaceInfo sandbox_info = {0};

if (windows_sandbox_info == NULL) {

content::InitializeSandboxInfo(&sandbox_info);

windows_sandbox_info = &sandbox_info;

}

content::ContentMainParams params(&main_delegate);

params.instance = args.instance;

params.sandbox_info =

static_cast<:sandboxinterfaceinfo>(windows_sandbox_info);

return content::ContentMain(params);

#else

content::ContentMainParams params(&main_delegate);

params.argc = args.argc;

params.argv = const_cast(args.argv);

return content::ContentMain(params);

#endif

它分析了命令行參数,提取”type”參数。假设为空。说明是Browser进程,返回-1。这样一路回溯到wWinMain方法里,然后開始创建Browser进程相关的内容。

假设”type”參数不为空,做一些推断,最后调用了content::ContentMain方法,直到这种方法结束。子进程随之结束。

content::ContentMain方法再追溯下去,就到了chromium的代码里了。在chromium/src/content/app/content_main.cc文件里。

详细我们不分析了,感兴趣的能够去看看。

分析了CefExecuteProcess方法我们知道,Browser进程在cefsimple_win.cc内调用了CefExecuteProcess之后做了进一步的配置,这个是在simple_app.cc内完毕的,详细就是SimpleApp::OnContextInitialized()这种方法。代码例如以下:

void SimpleApp::OnContextInitialized() {

CEF_REQUIRE_U

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值