访问冲突读取带有德尔福嵌入式铬 (CEF1) 的 cookie



我在应用程序上使用Delphi Embedding Chromium(CEF1),但在读取URL的cookie数据时遇到问题。

我找到了这段代码(包含在下面),但是在 XE3 上,当我使用它时,我会收到一个异常:

if WaitForSingleObject(vis.pEvent.Handle, INFINITE) = WAIT_OBJECT_0 then begin

例外情况是

项目 guiclient.exe 引发异常类 EAccessViolation 与 消息"地址 00000000 的访问冲突"。读取地址 00000000

暗示其中一个对象未正确创建或初始化。

我正在使用的代码(从上面的论坛链接复制)是:

  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;

很简单。CefVisitUrlCookies将你的对象作为引用计数接口,并在返回时释放它,obejct会自我破坏,因此你在尝试访问炸对象时会得到访问冲突。为了避免此问题,您可能需要在局部变量中存储对对象的引用,或者显式调用_addref:

vis._AddRef();
CefVisitUrlCookies(ed_url.Text, true, vis);
WaitForSingleObject(...)
vis._Release();

ivis: ICefCookieVisitor;
...
ivis := vis;
CefVisitUrlCookies(ed_url.Text, true, ivis);
WaitForSingleObject(...)
ivis := nil;

并且不要忘记删除免费通话。切勿使用引用计数显式释放接口对象。

相关内容

  • 没有找到相关文章

最新更新