gpt4 book ai didi

c++ - 卸载 CEF 崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:01 25 4
gpt4 key购买 nike

我们想从 MFC dll (Visual Studio 2015) 中显示一些浏览器窗口。不幸的是,一旦我们卸载 CEF,它就会崩溃。我们发现了非常相似的问题,但从未找到答案。

为了更好地了解问题,我们将所有 CEF 内容移动到另一个 dll (cefwrapper) 中。这些是我们基本上执行的主要步骤:

1.  LoadLibrary(cefwrapper.dll) 
2. Inside cefwrapper.dll
a. CefString(&settings.browser_subprocess_path) = "cefsimple.exe"
b. CefInitialize(args, settings, this, NULL)
c. window_info.SetAsChild(hwnd, rect);
d. browser_ = CefBrowserHost::CreateBrowserSync(window_info, browser_client_.get(), url, browser_settings, request_context);
e. ::SetParent(browser_->GetHost()->GetWindowHandle(), NULL); // Prevent getting a CLOSE Message
f. CloseBrowser();
g. Waiting until OnBeforeClose was called for all browsers.
h. CefShutdown();
i. (all sub-processes (cefsimple.exe) are gone by now)
3. FreeLibrary --> Crash

调用堆栈

libcef.dll!sandbox::BrokerServicesBase::~BrokerServicesBase() Line 135  C++
libcef.dll!sandbox::SingletonBase<sandbox::BrokerServicesBase>::OnExit() Line 63 C++
libcef.dll!_execute_onexit_table::__l2::<lambda>() Line 206 C++
libcef.dll!__crt_seh_guarded_call<int>::operator()<<lambda_7777bce6b2f8c936911f934f8298dc43>,int <lambda>(void) & __ptr64,<lambda_3883c3dff614d5e0c5f61bb1ac94921c> >(__acrt_lock_and_call::__l2::<lambda_7777bce6b2f8c936911f934f8298dc43> && setup, _execute_onexit_table::__l2::int <lambda>(void) & action, __acrt_lock_and_call::__l2::<lambda_3883c3dff614d5e0c5f61bb1ac94921c> && cleanup) Line 204 C++
libcef.dll!_execute_onexit_table(_onexit_table_t * table) Line 231 C++
libcef.dll!common_exit::__l2::<lambda>() Line 230 C++
libcef.dll!__crt_seh_guarded_call<void>::operator()<<lambda_d80eeec6fff315bfe5c115232f3240e3>,void <lambda>(void) & __ptr64,<lambda_2358e3775559c9db80273638284d5e45> >(__acrt_lock_and_call::__l2::<lambda_d80eeec6fff315bfe5c115232f3240e3> && setup, common_exit::__l2::void <lambda>(void) & action, __acrt_lock_and_call::__l2::<lambda_2358e3775559c9db80273638284d5e45> && cleanup) Line 224 C++
libcef.dll!common_exit(const int return_code, const _crt_exit_cleanup_mode cleanup_mode, const _crt_exit_return_mode return_mode) Line 278 C++

不调用 FreeLibrary 会将问题推迟到应用程序退出的时候。

我们正在使用 cef_binary_73.1.12+gee4b49f+chromium-73.0.3683.75_windows64

作为替代方案,我们通过 CreateProcess 启动 cefsimple.exe 并将 hwnd 传递给该进程。不幸的是,一段时间后,浏览器窗口卡住。

最佳答案

切勿为 CEF DLL 调用 FreeLibrary

Chromium 有许多全局对象(单例、实用程序线程),它们应该在应用程序结束之前一直存在。这样做是为了更快地终止应用程序:不会删除全局对象和单例,不会终止线程,在进程终止时没有人担心它。

当您调用 FreeLibrary 时,您破坏了这个架构。从 CEF 启动的线程保持事件状态,但释放 DLL 内存。因此你会崩溃。

要修复它,请不要执行第 3 步。

关于c++ - 卸载 CEF 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55648885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com