在一个表单上的两个铬实例的不同的cookie处理程序 [英] Different cookie handlers for two chromium instances on one form
问题描述
我在Delphi XE3上使用DCEF3。
任务是:为不同的TChromium实例创建不同的Cookie存储。
问题:我为每个TChromium实例创建不同的ICefCookieManager实例,并在GetCookieManager事件中返回。
示例代码:
type
TForm1 = class(TForm)
Button1:TButton;
Button2:TButton;
Chromium1:TChromium;
Chromium2:TChromium;
procedure Button1Click(Sender:TObject);
procedure Button2Click(Sender:TObject);
procedure FormCreate(Sender:TObject);
procedure Chromium1GetCookieManager(Sender:TObject;
const browser:ICefBrowser; const mainUrl:ustring;
out Result:ICefCookieManager);
procedure Chromium2GetCookieManager(Sender:TObject;
const browser:ICefBrowser; const mainUrl:ustring;
out Result:ICefCookieManager);
private
{Private declarations}
CookieManager:ICefCookieManager;
CookieManager2:ICefCookieManager;
public
{public declarations}
end;
var
Form1:TForm1;
procedure TForm1.FormCreate(Sender:TObject);
begin
CookieManager:= TCefCookieManagerRef.New('C:\Cookies\1');
CookieManager2:= TCefCookieManagerRef.New('C:\Cookies\2');
end;
procedure TForm1.Chromium1GetCookieManager(Sender:TObject;
const browser:ICefBrowser; const mainUrl:ustring;
out Result:ICefCookieManager);
begin
结果:= CookieManager;
end;
procedure TForm1.Chromium2GetCookieManager(Sender:TObject;
const browser:ICefBrowser; const mainUrl:ustring;
out Result:ICefCookieManager);
begin
结果:= CookieManager2;
end;
procedure TForm1.Button1Click(Sender:TObject);
begin
Chromium1.Load('http://somesite.com');
end;
procedure TForm1.Button2Click(Sender:TObject);
begin
Chromium2.Load('http://somesite.com');
end;
如果我添加 ShowMessage('First')
到 Chromium1GetCookieManager
事件和 ShowMessage('Second')
到 Chromium2GetCookieManager
,总是显示消息第一,无论是按button1还是button2。
换句话说,Chromium1GetCookieManager被调用的两个实例。
如何解决问题?
>只需关闭project1.dpr中的cefsingleprocess变量即可。
示例:
程序Project1;
使用
形式,
cefvcl,
ceflib,
Unit1在'Unit1.pas'{Form1};
{$ R * .res}
begin
CefSingleProcess:= False; //这是我所说的
Application.Initialize;
Application.CreateForm(TForm1,Form1);
Application.Run;
end。
I'm using DCEF3 on Delphi XE3.
Task is : Create different cookie storages for different TChromium instances.
Problem : I'm creating different ICefCookieManager instances for each TChromium instances and its returning in GetCookieManager event.
Example code:
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Chromium1: TChromium;
Chromium2: TChromium;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Chromium1GetCookieManager(Sender: TObject;
const browser: ICefBrowser; const mainUrl: ustring;
out Result: ICefCookieManager);
procedure Chromium2GetCookieManager(Sender: TObject;
const browser: ICefBrowser; const mainUrl: ustring;
out Result: ICefCookieManager);
private
{ Private declarations }
CookieManager: ICefCookieManager;
CookieManager2: ICefCookieManager;
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure TForm1.FormCreate(Sender: TObject);
begin
CookieManager:=TCefCookieManagerRef.New('C:\Cookies\1');
CookieManager2:=TCefCookieManagerRef.New('C:\Cookies\2');
end;
procedure TForm1.Chromium1GetCookieManager(Sender: TObject;
const browser: ICefBrowser; const mainUrl: ustring;
out Result: ICefCookieManager);
begin
Result:=CookieManager;
end;
procedure TForm1.Chromium2GetCookieManager(Sender: TObject;
const browser: ICefBrowser; const mainUrl: ustring;
out Result: ICefCookieManager);
begin
Result:=CookieManager2;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Chromium1.Load('http://somesite.com');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Chromium2.Load('http://somesite.com');
end;
If I add ShowMessage('First')
to Chromium1GetCookieManager
event, and ShowMessage('Second')
to Chromium2GetCookieManager
, always the message "First" will be shown, no matter whether I press button1 or button2.
In other words Chromium1GetCookieManager is called for both instances.
Problem is solved, thanks to all.
How to solve the problem?
Just turn off cefsingleprocess variable in your project1.dpr.
Example:
program Project1;
uses
Forms,
cefvcl,
ceflib,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
CefSingleProcess := False;//this what i'm talking about
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
这篇关于在一个表单上的两个铬实例的不同的cookie处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!