Заставьте CEF использовать отдельный исполняемый файл для запуска подпроцессов (C ++ / Windows)

1

Я пытаюсь изменить пример "cefsimple" из Chromium Embedded Framework (https://bitbucket.org/chromiumembedded/cef/wiki/Tutorial), так что он использует отдельный исполняемый файл для запуска своих подпроцессов в Windows,

Однако это не работает так, как ожидалось, и каждый раз при сбое вызова CefInitialize каждый раз вызывает сбои в главном процессе, прежде чем всплывает окно или запускается какой-либо подпроцесс. Стек вызовов:

    chrome_elf.dll!00007ffaa7fc1cfd()   
    chrome_elf.dll!00007ffaa7fba5fc()   
    chrome_elf.dll!00007ffaa7fb9c9b()   
    libcef.dll!00007ffa88dae13c()   
    libcef.dll!00007ffa882fc146()   
>   cefsimple.exe!CefInitialize(const CefMainArgs & args, const CefStructBase<CefSettingsTraits> & settings, CefRefPtr<CefApp> * application, void * windows_sandbox_info)  Line 201 + 0xb4 bytes   C++

Использование: CEF версии 3.2883.1539, 64-разрядной версии, C++, VS 2015, Windows 10.

Мое решение: я добавил еще одну цель (cefsimpleHelper.exe) в CMakeLists и использовал эти инструкции в качестве ссылки для изменения исходного кода: https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-separate -sub-процесс, выполняемый

cefsimple_win.cc: (точка входа основного исполняемого файла)

int APIENTRY wWinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPTSTR    lpCmdLine,
                      int       nCmdShow)
{
  UNREFERENCED_PARAMETER(hPrevInstance);
  UNREFERENCED_PARAMETER(lpCmdLine);

  CefEnableHighDPISupport();
  CefMainArgs main_args(hInstance);

  CefSettings settings;
  settings.no_sandbox = true;
  CefString(&settings.browser_subprocess_path).FromASCII("cefsimpleHelper.exe");

  CefRefPtr<SimpleApp> app(new SimpleApp);

  CefInitialize(main_args, settings, app.get(), NULL);
  CefRunMessageLoop();
  CefShutdown();

  return 0;
}

process_helper_win.cc: (точка входа для запуска подпроцесса)

int APIENTRY wWinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR    lpCmdLine,
    int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    CefMainArgs main_args(hInstance);
    CefRefPtr<SimpleApp> app(new SimpleApp);
    return CefExecuteProcess(main_args, app.get(), nullptr);
}

Любые идеи, что может быть проблемой?

  • 0
    Вы можете попробовать отладить его и выяснить, какая строка исходного кода CEF / Chromium вызвала сбой. Вам просто нужны символы отладки из cefbuilds.com и исходный код CEF из bitbucket.org/chromiumembedded/cef . Возможно, вам также понадобится код Chromium. Это немного сложнее, но здесь есть инструкция: chromium.org/developers/how-tos/get-the-code
  • 1
    Ваш основной exe запускается дважды, второй раз - новый процесс аварийного запуска, проверьте трекер проблем, есть открытая проблема. chrome_elf.dll был добавлен специально для поддержки crashpad.
Теги:
process
chromium-embedded

1 ответ

1

Я думаю, что нашел решение, в основном случайным методом и ошибкой: P

Я только что добавил вызов CefExecuteProcess в основной исполняемый файл, прежде чем CefInitialize:

const auto exit_code = CefExecuteProcess(main_args, app.get(), nullptr);
if (exit_code >= 0)
    return exit_code;

Спасибо за все комментарии, я надеюсь, что это тоже поможет другим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню