I using Delphi Embedding Chromium (CEF1) on my application and am having trouble reading the cookie data of an URL.
I have found this code (included below), but on XE3 I get an exception when I use it about this line:
if WaitForSingleObject(vis.pEvent.Handle, INFINITE) = WAIT_OBJECT_0 then begin
The exception is
Project guiclient.exe raised exception class EAccessViolation with message 'Access violation at address 00000000'. Read of address 00000000
implying one of the objects is not created or initialised properly.
The code I am using (copied from the above forum link) is:
TCustomVisitor = class (TCefCookieVisitorOwn)
private
fcookie: PCefCookie;
function visit(const name, value, domain, path: ustring; secure, httponly,
hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
count, total: Integer; out deleteCookie: Boolean): Boolean; override;
public
pEvent: TEvent;
function getCookies: PCefCookie;
constructor Create; override;
end;
constructor TCustomVisitor.Create;
begin
inherited;
pEvent := TEvent.Create(nil, False, False, 'ev.chromium');
new(fcookie);
end;
function TCustomVisitor.getCookies;
begin
Result := fcookie;
end;
function TCustomVisitor.visit(const name, value, domain, path: ustring; secure, httponly,
hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
count, total: Integer; out deleteCookie: Boolean): Boolean;
begin
fcookie.name := CefString(name);
fcookie.value := CefString(value);
fcookie.domain := CefString(domain);
fcookie.path := CefString(path);
fcookie.secure := secure;
fcookie.httponly := httponly;
fcookie.has_expires := hasExpires;
//fcookie.creation := DateTimeToCefTime(creation);
//fcookie.last_access := DateTimeToCefTime(lastAccess);
//fcookie.expires := DateTimeToCefTime(expires);
SetEvent(pEvent.Handle);
end;
procedure TfrmAuth.bt_okClick(Sender: TObject);
var
vis: TCustomVisitor;
cname, cvalue: uString;
ccookie: PCefCookie;
begin
if crm.Browser<>nil then begin
vis := TCustomVisitor.Create;
try
CefVisitUrlCookies(ed_url.Text, true, vis);
// !!! This line causes the access violation
if WaitForSingleObject(vis.pEvent.Handle, INFINITE) = WAIT_OBJECT_0 then begin
ccookie := vis.getCookies;
cname := CefString(@ccookie.name);
cvalue := CefString(@ccookie.value);
end;
finally
vis.Free;
end;
end;
end;