MFC嵌入CEF3使用单进程模式是可以的,多进程模式出问题,哪里不对呢

发布于 2021-12-01 20:59:55 字数 2094 浏览 896 评论 2

为了便于维护和使用,我使用CEF3提供的文件封装了一个dll,供其他模块使用,其中的初始化部分如下:


CEFWEBCLIENT_API BOOL InitializeCef(HINSTANCE hInstance)
{
	//CEF Initialize
	//g_command_line = CefCommandLine::CreateCommandLine();
	//LPTSTR lpszLine = ::GetCommandLineW();
	//g_command_line->InitFromString(lpszLine);

	CefMainArgs main_args(hInstance);
	CefRefPtr<ClientApp> app(new ClientApp());
	int exit_code = CefExecuteProcess(main_args, app.get());
	if (exit_code >= 0)
		return FALSE;

	CefSettings settings;
	CefSettingsTraits::init(&settings);
	settings.multi_threaded_message_loop = true;	//使用主程序消息循环
	settings.single_process = false;			//使用多进程模式
	settings.ignore_certificate_errors = true;		//忽略掉ssl证书验证错误
	settings.command_line_args_disabled = true;
	CefString(&settings.locale).FromASCII("zh-CN");

	return CefInitialize(main_args, settings, app.get());
}

创建Web窗口的导出函数如下:


CEFWEBCLIENT_API BOOL CreateBrowser(HWND hWnd,RECT &rtClient,
                            CefRefPtr<CefClient> client,
                            const TCHAR* url)
{
	if(!g_bInstance)
	{
		HINSTANCE hAppIns = GetModuleHandle(NULL);
		if(!InitializeCef(hAppIns))
			return FALSE;
		g_bInstance = TRUE;
	}
	CefWindowInfo info;
	CefBrowserSettings settings;
	
	// Initialize window info to the defaults for a child window
	info.SetAsChild(hWnd, rtClient);
	return CefBrowserHost::CreateBrowser(info,client,url,settings,NULL);
}

然后新建一个基于CDialog的应用程序,在Dialog客户区创建一个Web页面,结果是:

1、单进程模式下没有问题,一切正常,但是在程序退出的时候调用CefShutdown()会直接崩溃掉!不调用这一句没事,但调试发现CefRefPtr<ClientApp> app(new ClientApp())这个app是不会析构的

2、多进程模式下,会弹出两个Dialog窗口,一个Dialog中的Web页面能正常打开,另一个是空白,而且ClientApp::OnWebKitInitialized()不会被调用,在这个函数里面注册的V8 JS回调函数直接就不起作用了!为嘛CEF3提供的那个例子多进程就没问呢,是我哪里缺少了设置,还是因为重新封装dll的问题?

望同仁们指点一二!










如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时光清浅 2021-12-05 13:07:30

注意一下CefExecuteProcess这个函数。CEF3是多进程的,如果是主进程这个函数立即返回并继续往下执行;如果是子进程这个函数会阻塞直到
子进程需要退出(比如关闭了一个浏览器窗口)。

回忆凄美了谁 2021-12-04 11:32:00

我好像研究出是啥情况了:

一般单进程模式是用来调试的,release版本最好是多进程模式,如果debug版本也是多进程的话,由于Browser、Rendder等进程是独立分开的,所以即便在一些函数中打上断点也进不去!而单进程话就都可以进去。至于debug版本多进程模式下为何会弹出两个主程序窗口我也不是很清楚,但是release版本多进程模式下就正常了,只有一个主程序窗口。并且多进程模式下调用CefShutdown就是OK的,app也能够正常析构,而单进程模式调用CefShutdown会直接崩溃!

  另外,官方文档上说release版本单进程不是很稳定,不建议使用单进程模式,但目前我还没发现什么问题

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文