最近研究CEF遇到两个很奇怪的问题:1、调用dll总是显示14001错误;2、CEF白屏。
第一个问题场景:把CEF3作为控件封装到一个静态库里面去,运行的时候是需要另外一个动态库调用封装好的cef控件,然后一个exe调用动态库,调用的时候总是loadlibrary失败,GetLastError为14001。
该问题出现的原因是cef两个关键的库,其中一个libcef_dll_wrapper.lib是一个静态库,当我用静态库加载静态库的时候,实际只是把链接加载进去了,实际调用的时候又需要dll去加载包裹的静态库,这时候应该是找不到libcef_dll_wrapper.lib库的,所以报错。具体原因没有详细去探讨,有时间再去研究。
解决第一个问题的方法,把CEF封装为一个单独的动态库就解决了。接着又遇到第二个问题了,放到工程里面运行起来之后,弹出带有cef控件的界面,白屏。心酸。
这个问题在网上找了很久,网上列举的原因大致有这么几点,可以自行对照当前的情况去试验:
1、资源文件没有加载全,比如有一些必须的dll和资源如下图:
这个是必须要的,作为一个老选手,这个我是没问题的。
2、有的说是需要加载两个.manifest文件,这个我也试过,不是我问题的所在,我的是VS2017,CEF版本是
不存在这种问题,事实证明我不加载.manifest文件也是正常的。
3.有人说CEF初始化需要放到其他实例的前面,这个给了我很大的启发。我的就是这个问题堵住了。主要原因我也找到了。如果CEF初始化的时候single_process属性没有设置或者设置的false,是多进程模式,多进程模式在显示cef控件的时候需要两次进入dll,但是我的工程有个互斥量控制只能启动一个实例,把第二次进入dll的操作给拦截了,所以渲染进程启动不起来,所以白屏。解决方法是single_process设置为true,初始化cef,这样就是渲染和浏览器在一个进程,但是官方说明说这种方式不太稳定。另外的方法就是去掉限制两次重入dll的互斥量喽。
4.如果窗口设置的透明也会显示不出来CEF控件。
有需要帮助的可以联系qq 295282563