Хобрук: Ваш путь к мастерству в программировании

Нарушение прав доступа при чтении файла cookie с помощью встроенного в Delphi Chromium (CEF1)

Я использую Delphi Embedding Chromium (CEF1) в своем приложении, и у меня возникли проблемы с чтением данных cookie для URL-адреса.

Я нашел этот код (приведен ниже), но на 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;

  • Какую ошибку вы получаете? Информация об ошибке важна - пожалуйста, опубликуйте ее! Также, вероятно, стоит включить свой код в том виде, в котором он у вас есть, а не ссылку на форум. Лучше всего (а) иметь всю информацию в самом вопросе, а не ссылку, которая может исчезнуть в будущем; (б) просмотреть свой реальный код на случай, если причиной является ошибка преобразования кода примера в соответствии с вашим приложением. 01.02.2013
  • У меня нет отчета об ошибке, потому что это не человеческая ошибка, а шестнадцатеричный код (я думаю). Я думаю, что с кодом в ссылке какая-то проблема. 01.02.2013
  • Ну что такое шестнадцатеричный код? (ICE, внутренняя ошибка компилятора? Или он компилируется и код имеет значение HRESULT? Или ... Что это такое? Я не знаю, а вы не сказали.) Пожалуйста, включите всю информацию! < / i> Мы не можем вам помочь, основываясь на догадках. 01.02.2013
  • Это ошибка: Project guiclient.exe вызвал класс исключения EAccessViolation с сообщением «Нарушение прав доступа по адресу 00000000». Прочтите адрес 00000000. Это может вам помочь? 01.02.2013
  • Убедитесь, что вы создаете экземпляр посетителя. В этом коде это строка vis := TCustomVisitor.Create. 01.02.2013
  • Экземпляр Visitor создан. Как видите по ссылке. 01.02.2013
  • Понятно, значит, вы используете именно тот код из этой ссылки. 01.02.2013
  • TLama, я не был бы уверен в этом, он еще не опубликовал свой настоящий код. Мартин, легко ошибиться при копировании / вставке кода ... пожалуйста, если вам нужна помощь, вам нужно напишите лучший вопрос. Я отредактировал ваш вопрос, чтобы он был яснее, но, пожалуйста, добавьте свой собственный реальный код и любую другую полезную информацию. 01.02.2013
  • Учитывая код, фактически показанный до сих пор, что-то внутри CefVisitUrlCookies() (которое еще не было показано) должно каким-то образом освобождать / повреждать объект TCustomVisitor. Это единственный способ сделать либо переменную vis, либо ее член pEvent недействительным к моменту вызова WaitForSingleObject(). 02.02.2013

Ответы:


1

это очень просто. CefVisitUrlCookies принимает объект как интерфейс подсчета ссылок и освобождает его при возврате, а объект уничтожает себя, поэтому вы получаете нарушение прав доступа при попытке доступа к жареному объекту. Чтобы избежать этой проблемы, вы можете либо сохранить ссылку на объект среди локальных переменных, либо явно вызвать _addref:

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

or

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

и не забудьте убрать бесплатный звонок. Никогда не следует явно освобождать объекты с интерфейсом с помощью подсчета ссылок.

14.04.2013
Новые материалы

Дрейф концепций в ИИ
Что такое концептуальный дрейф? Дрейф понятий — это явление в искусственном интеллекте и машинном обучении, при котором основное распределение данных меняется со временем. Это изменение в..

Изучите Vue перед React. Вот почему
Сегодняшняя сеть представляет собой запутанный беспорядок из разных языков, библиотек и фреймворков, и начинающие веб-разработчики часто не могут понять, что изучать в первую очередь. Что вы..

Гл.31 — Помощь слабослышащим с помощью возможностей машинного обучения Apple Watch.
1 500 000 000  – количество людей с потерей слуха в мире. Это почти 20% населения Земли! (источник: who.int ) Недавно я экспериментировал с Apple Sound Classification API, и результаты на..

Машинное обучение без кода / Глубокое обучение Каждый специалист по обработке и анализу данных должен знать
Akkio, Очевидно.ай, DataRobot, Левити, Clarifai, Teachable Machines, Lobe, Pimer, DynaBench, APAflow Teachable Machine- https://teachablemachine.withgoogle.com/ Vertex AI..

Код, который работает вместе, остается вместе
Первоначально это было опубликовано в tiagojdf . Когда я только начинал как младший программист, я всегда терялся, глядя на внутренний код. Я предположил, что отчасти это было из-за того,..

Эта модель Google сочетает в себе рассуждение и действие в рамках одной языковой модели.
ReAct предоставляет архитектуру, которая инициирует действия на основе путей рассуждений языка. Недавно я запустил образовательный информационный бюллетень, посвященный ИИ, у которого уже..

Сортировка структур JSON по нескольким полям в JavaScript
Array.sort() не для слабонервных. Особенно, когда речь идет о сортировке сложных структур данных. Большинство руководств по JavaScript дают только краткое введение в Array.sort() . Обычно..


© 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании