Я пытаюсь изменить пример "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);
}
Любые идеи, что может быть проблемой?
Я думаю, что нашел решение, в основном случайным методом и ошибкой: P
Я только что добавил вызов CefExecuteProcess в основной исполняемый файл, прежде чем CefInitialize:
const auto exit_code = CefExecuteProcess(main_args, app.get(), nullptr);
if (exit_code >= 0)
return exit_code;
Спасибо за все комментарии, я надеюсь, что это тоже поможет другим.