Встроенная среда Chromium: создание объекта завершается неудачно при использовании «ExecuteFunctionWithContext» - PullRequest
3 голосов
/ 27 марта 2012

Обзор

Я использую интегрированную хромированную среду (cef) в Delphi 2009, это последняя версия.

Ошибка

Я могу использовать ExecuteFunctionWithContext, чтобы успешно выполнить процедуру обратного вызова JavaScript, и могу предоставить ее с аргументами.Однако когда я пытаюсь использовать TCefv8ValueRef.CreateObject(nil);, нарушение доступа происходит в библиотеке libcef .

Допущения

  1. Передача аргумента в функцию обратного вызова JavaScript работает для TCefv8ValueRef.CreateString и всех других типов Cefv8Value.
  2. Функция TCefv8ValueRef.CreateObject(nil) прекрасно работает, когда она используется в качестве возвращаемого значения для расширения хрома.(Как подробно описано в демоверсии /demos/guiclient для Delphi CEF).
  3. Объект TChromium удерживается в главной форме.

Возможные решения и размышления

  1. Я пытался использоватьTCefv8ValueRef.CreateObject(nil); через событие OnClick в главной форме, это также привело к нарушению доступа.Тем не менее, TCefv8ValueRef.CreateString('test'); будет работать нормально.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 01 октября 2013

У меня была такая же проблема на C ++!И я решил эту проблему с помощью следующего кода:

CefRefPtr<CefFrame> frame = browser->GetMainFrame();
CefRefPtr<CefV8Context> v8Context = frame->GetV8Context();
if (v8Context.get() && v8Context->Enter())
{
    CefRefPtr<CefV8Value> object = CefV8Value::CreateObject(NULL);
    // ExecuteFunctionWithContext and other actions

    v8Context->Exit();
}

Документация, включенная в хром:Если V8 в настоящее время не находится внутри контекста, или если вам нужно извлечь и сохранить ссылку на контекст, вы можете использовать один из двух доступных статических методов CefV8Context.GetCurrentContext () возвращает контекст для фрейма, который в данный момент выполняет JS.GetEnteredContext () возвращает контекст для фрейма, где началось выполнение JS.Например, если функция в frame1 вызывает функцию в frame2, то текущий контекст будет frame2, а введенный контекст будет frame1.

Массивы, объекты и функции могут быть только созданы, изменены и, в случаефункций, выполняемых, если V8 находится внутри контекста.Если V8 не находится внутри контекста, то приложение должно войти в контекст, вызвав Enter (), и выйти из контекста, вызвав Exit ().Методы Enter () и Exit () должны использоваться только:

  1. При создании объекта, функции или массива V8 вне существующего контекста.Например, при создании объекта JS в ответ на собственный обратный вызов меню.

  2. При создании объекта, функции или массива V8 в контексте, отличном от текущего контекста.Например, если вызов, исходящий из frame1, должен изменить контекст frame2.

Так вот почему вы не смогли создать объект, но смогли создать строки js.Также вы можете увидеть пример общего использования .

...