[原创]嵌入CEF遇到的问题及解决方案

时间:2023-03-14 19:26:38

这几天程序嵌入谷歌浏览器,各种坑,不容易,记录之。。。希望到此为止

1. 开了多进程模式之后,渲染进程RenderProcess断点没有进入。

  只有在单进程模式(CefSingleProcess为true)下调试,渲染进程的断点才会进入。如果开多进程模式,那么渲染进程是在另外一个进程,不是主进程,当前调试进程是主进程,所以就没法进入渲染进程的断点,但是实际上,渲染进程的RenderProcessHandler的方法还是会被触发的。

2. 在渲染进程操作浏览器进程没有效果。

  渲染进程(RenderProcess)和浏览器进程(BrowserProcess)之间的通讯必须通过进程间通讯才可以,直接调用是没有效果的。不管是在多进程模式下还是在单进程模式下。

3. 多进程模式下进程间通讯传接口地址失败。

  多进程模式下,进程不在同一个地址空间,不能直接传地址,只能传值类型。

4. 有下载的页面打开后,再关闭程序后会自动启动一次程序。

  自动启动程序应该是程序崩溃后CEF的机制,那么问题应该是关闭时程序崩溃了。猜测是有下载页面,CEF会启动一个下载进程,而这个下载进程会关联窗体,如果在CEF调用CefShutDown之前窗体已经释放掉了,就会崩溃。所以我的办法是在窗体释放前就调用了CefShutDown,不知道是不是这个原因,反正问题解决了。

5. 快速打开很多页面时整个程序会卡死。

  猜测是GPU合成的问题,关闭后就没有这个现象了。

6. 每开一个Tab都会创建一个进程。

  参考下面的说明,根据需求开启不同的进程模型。

    1. Process-per-site-instance:就是你打开一个网站,然后从这个网站链开的一系列网站都属于一个进程。这是Chrome的默认模式。
    2. Process-per-site:同域名范畴的网站放在一个进程,比如www.google.com和www.google.com/bookmarks就属于一个域名内(google有自己的判定机制),不论有没有互相打开的关系,都算作是一个进程中。用命令行--process-per-site开启。
    3. Process-per-tab:这个简单,一个tab一个process,不论各个tab的站点有无联系,就和宣传的那样。用--process-per-tab开启。
    4. Single Process:这个很熟悉了吧,传统浏览器的模式,没有多进程只有多线程,用--single-process开启。

7. 没有了