简介
ACF(Admenri Cef Framework)是一个专为 易语言编写的一套CEF接口转接框架,
旨在提供更好的CEF体验与提升易语言自身浏览器的运行效率,
ACF提供完全面向对象的编程环境,所有回调均以类的形式进行传递,
所有浏览器操作也均在类中完成。
应用场合
①提供对某些ie不支持的网站的渲染
②webgl绘图渲染工作
③网络应用客户端
④交互式webui
⑤性能优异且支持H5的网页浏览器
框架特性
①清晰的模块结构,便于理解的调用方式
②使用类继承的方式自定义事件回调,不受参数类型限制
③支持多进程编程,可使用自带进程通信进行进程间传输消息
④更快的启动速度&加载速度,使用内存函数表映射极大裁剪了dll体积
⑤独家魔改Chromium85内核,加入对Google服务的支持与Widevine支持和Pointer lock&H265等
开始学习
Cef是谷歌工程师利用业余时间开发的一款基于Chromium的开源嵌入式框架,
旨在方便应用程序嵌入Chromium浏览器框架以实现H5特性,
由于基于Chromium修改,所以Cef也继承了相应的特性,其中包括:
①多进程模型
https://blog.csdn.net/u011304970/article/details/77678839
②主进程线程结构
http://www.360doc.com/content/13/0422/15/168576_280135766.shtml
这样,我们从窗口程序开始编写
(注意程序需要从 _启动子程序 启动)
①:ACF的类回调拥有两种传递方式:
a. 引用计数 -> 直接传递易语言类回调指针,可在易语言程序中随时获取回调数据,
但要注意类回调变量是否被销毁
b. 复制数据 -> 复制易语言类数据后传入ACF模块,对类的数据修改只能在调用子程序之前,
传递参数后对类数据的修改会无效化
②:前面提到的Chromium多进程结构,此处需要判断当前进程环境是否为浏览器的子进程,
如果为子进程则无需处理UI相关的代码,直接返回退出程序即可。
③:运行到此说明当前环境已经符合浏览器主进程的运行环境,
要想成功运行Chromium程序,我们需要对ACF进行初始化。
④执行完所有准备工作,就可以开始创建易语言的UI部分了
------------------------------------------------------------------------------
这里要介绍到ACF的一个重要特性:类回调
此时初始化的事件回调参数需要一个ACFApp类型的参数
而我们输入的参数却是另一个类型
但其实这个类继承自ACFApp,所以作为其子类作为参数不会报错,
这样的方式叫做类的继承,简单的说就是覆盖原先父类的方法以实现自定义功能
这里我们需要打开ACF的模块源码->找到对应的类回调->复制全部->更改名称并设置继承类
之后即可以变量的形式来使用类回调接收事件通知
AdmCef.e->类模块: ACFApp->全部复制->改成你想要的名字: 测试_回调->基类: ACFApp
全局变量 全局_回调事件 测试_回调 √
注意如果开头设置为类回调为引用计数,需要注意变量的销毁,此时不建议使用局部变量来作为类回调:
此时就会崩溃退出
--------------------------------------------------------------------------------------------
初始化完毕,窗口UI创建完成后我们就可以进行创建浏览器的操作了
这里用到了前面提到的线程概念
※CEF中常用的线程有:
UI线程 -> 管理绝大部分浏览器功能,在多线程消息循环下异于主线程。
IO线程 -> 管理文件及网络下载读写,包括cookie操作
Renderer线程 -> 仅单进程模式有效,可直接在当前线程获取js返回值
关于 ACF.投递任务
此方法可将某子程序在指定线程上进行运行,
作为ACF中唯一使用子程序指针的回调,
回调子程序需要严格遵守参数中指定格式进行定义:
否则会导致无法平栈崩溃
--------------------------------------------------------------------------------------------------------
大致流程图
本期工程源码(包含运行环境):
https://admenri.lanzoui.com/b0d2tp66h
密码:3e8c
源码文件为acf_browser.e
如有其他疑问可以加群一起讨论
|