登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: [推荐]lazarus 下如何使用 dcef3?     [回主站]     [分站链接]
标题
[推荐]lazarus 下如何使用 dcef3?
clq
浏览(258) + 2020-05-10 21:01:15 发表 编辑

关键字:

[2020-05-16 13:16:47 最后更新]
lazarus 下如何使用 dcef3?

据说 dcef3 的升级版本 dcef4 是有 lazarus 支持的,但那不支持 cef2623 版本。
因此用的 dcef3 ,但看了 dcef3 中并没有 lazarus 支持,即使它的代码中写的相关的编译选项,实际上是不能工作的。

搜索网络后发现有 fpCEF3
https://github.com/dliw/fpCEF3

据说可以支持,几经周折编译成功后发现它可能是太老了,也并不支持 cef2623 ,只好回头过来再自己修改 dcef3 ... 所以看到这篇文章的网友们,你们真的很幸运,这大概是整个网络第一篇。 ...哈哈,开玩笑的了

首先,我的版本是 lazarus-2.0.2-fpc-3.0.4 64位,并且安装了 lazarus-2.0.2-fpc-3.0.4-cross-i386-win32-win64 的 32 位编译器。
dcef 是我自己修改过的 dcef2623 不过用原版的话修改方法应该是一样的,以下是修改方法:

1.首先是调用代码
根据我使用 decf 多时的经验,还是不要安装它的控件包的好,直接包含路径就好了。以下是调用代码:
unit ld3main;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, Forms, Controls, Graphics,
ceflib,
cefvcl,
Dialogs, StdCtrls;

type

{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private

public
web1:TChromium;
end;

var
Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
web1 := TChromium.Create(self);

web1.Parent := self;

web1.Align := alClient;
web1.Show;

//web1.CreateBrowser(); //不公开的函数
web1.ReCreateBrowser('http://www.baidu.com');

//web1.Load('');
Button2.BringToFront;

{

OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
weixin_30845171 2019-01-28 13:46:00 91 收藏
展开



经过搜索查找,发现错误原因是我在win7 x64的机器上装了64位的python IDLE,不能有效load32位的dll,换成32位的python就好了。

转载于:https://www.cnblogs.com/sea-stream/p/10329928.html
weixin_30845171
}
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
web1.Load('http://newbt.net');
end;

end.

以上代码当然是不能马上编译的。

2.设置源码路径
lazarus 的源码路径有好几个选项,要设置项目属性中的 "Path->Other units files(-Fu)" 这里,其他位置是不行的。
对于我的版本 la 来说就是第一条选项。

3.在 dcef3 源码的 cefvcl.pas cefvcl.pas 开关部分禁用掉 CEF_MULTI_THREADED_MESSAGE_LOOP DELPHI14_UP DELPHI16_UP 这几个专门针对 FPC (也就是 lazarus) 的相关编译选项,因为它根本就是错的,还是当做普通的 delphi 特性好了。我就是按 delphi7 的特性来选择的。

因为这些特性都是在 cef.inc 中引入的,所以禁用代码在紧跟在 cef.inc 之后写上,如下:

{$I cef.inc}

{$UNDEF CEF_MULTI_THREADED_MESSAGE_LOOP} //clq 2020 注意在 ceflib, cefvcl 中都要在 cef.inc 之后禁用 CEF_MULTI_THREADED_MESSAGE_LOOP

{$UNDEF DELPHI14_UP} //clq 2020 //dcef3 中对 fpc 的支持应该是有误的,要禁用 DELPHI14_UP, DELPHI16_UP 的功能才行
{$UNDEF DELPHI16_UP} //clq 2020

4.la 其实并没有完全兼容 delphi 代码,里面有个 TCreateParams 相关的函数,需要修改好几个地方,首先是它要加一个 la 的专用单元。如下:
interface
uses
Windows, Messages, Classes,
cefgui, ceflib,
LCLType, //clq 2020 for TCreateParams

5.dcef3 是在 CreateWindowHandle 中调用的 cef 函数去实际创建 cef 控件的,但遗憾的是这个函数 la 的窗体类并没有用到,修复后并没有用,但还是要给它修复,要不编译不了。

//clq 2020 //这个报错,可能要用 CreateSubClass
//procedure CreateWindowHandle(const Params: TCreateParams); override;
procedure CreateWindowHandle(const Params: TCreateParams); //override;

6.因为 la 没有调用 CreateWindowHandle 所以要想办法自己调用一下,所以我们的代码中有以下的代码:

//web1.CreateBrowser(); //不公开的函数
web1.ReCreateBrowser('http://www.baidu.com');

7.但这个 ReCreateBrowser 有个保护判断,所以还要修改这个函数本身,如下:
procedure TCustomChromium.ReCreateBrowser(const url: string);
begin
//if (FBrowser <> nil) and (FBrowserId <> 0) then //clq 2020 lazarus 不支持 CreateWindowHandle , 只好修改这个
begin
FBrowserId := 0;
FBrowser := nil;

CreateBrowser;
Load(url);
end;
end;

其实就是注释掉第一行就行了,否则您调试的时候会发现代码根本没往下走,当然网友们也可以按其他的方式,总之是要让 CreateBrowser 能调用上。

8.如果没有禁用 CEF_MULTI_THREADED_MESSAGE_LOOP 即使编译成功了,运行时也会发现窗体是个空白,什么也没有,幸好这种现象我在使用 dcef3 时不知道出现过多少次了,我的方法就是禁用 CEF_MULTI_THREADED_MESSAGE_LOOP

禁用后 dcef3 会开一个定时器去不停地调用 cef3 消息循环,所以还要修正一些错误。有两个地方,一是修改单元引用,二是修改 ontime 的函数原型,因为 la 和 delphi 的有一个变量类型不同,会报错。

implementation
{$IFNDEF CEF_MULTI_THREADED_MESSAGE_LOOP}
uses
{$IFDEF DELPHI16_UP}
Vcl.AppEvnts;
{$ELSE}
//AppEvnts; //clq 2020 不支持
SysUtils;
{$ENDIF}

...

//procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: Pointer; dwTime: DWORD); stdcall;
//procedure _TimerProc(hwnd: HWND; uMsg: UINT; idEvent: Pointer; dwTime: DWORD); stdcall; //clq 2020
//TIMERPROC = procedure (hWnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD); stdcall;
procedure _TimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD); stdcall;

9.如果编译为 64 位的编译成功了也是运行不了的,我也觉得奇怪,按道理说 64 位程序应该是可以调用 32 位 dll 的呀。
但这样会报 OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
所以要安装交叉编译包修改项目属性编译为 32 位的程序才行。

参考 https://blog.csdn.net/weixin_30845171/article/details/97344572

"
OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
weixin_30845171 2019-01-28 13:46:00 91 收藏

经过搜索查找,发现错误原因是我在win7 x64的机器上装了64位的python IDLE,不能有效load32位的dll,换成32位的python就好了。

转载于:https://www.cnblogs.com/sea-stream/p/10329928.html
"

--------------------------------------------------------

最后,不知道是不是我的错觉。感觉 la 下的 dcef3 要比 delphi7 中稳定得多。



总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1