0

アプリケーションでDelphiEmbeddingChromium(CEF1)を使用していますが、URLのCookieデータを読み取るのに問題があります。

このコード(以下に含まれています)を見つけましたが、XE3では、この行について使用すると例外が発生します。

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

例外は

プロジェクトguiclient.exeは、メッセージ「アドレス00000000でのアクセス違反」で例外クラスEAccessViolationを発生させました。アドレス00000000の読み取り

オブジェクトの1つが適切に作成または初期化されていないことを意味します。

私が使用しているコード(上記のフォーラムリンクからコピー)は次のとおりです。

  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;
4

1 に答える 1

1

とても簡単です。CefVisitUrlCookies はオブジェクトを参照カウント インターフェイスとして受け取り、返されたときにオブジェクトを解放し、オブジェクト自体が破棄されるため、揚げたオブジェクトにアクセスしようとするとアクセス違反が発生します。この問題を回避するには、オブジェクトへの参照をローカル変数に格納するか、_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;

無料通話を削除することを忘れないでください。参照カウントを使用して、インターフェース化されたオブジェクトを明示的に解放しないでください。

于 2013-04-14T20:16:21.127 に答える