MFC嵌入CEF3使用单进程模式是可以的,多进程模式出问题,哪里不对呢
为了便于维护和使用,我使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
注意一下CefExecuteProcess这个函数。CEF3是多进程的,如果是主进程这个函数立即返回并继续往下执行;如果是子进程这个函数会阻塞直到
子进程需要退出(比如关闭了一个浏览器窗口)。
我好像研究出是啥情况了:
一般单进程模式是用来调试的,release版本最好是多进程模式,如果debug版本也是多进程的话,由于Browser、Rendder等进程是独立分开的,所以即便在一些函数中打上断点也进不去!而单进程话就都可以进去。至于debug版本多进程模式下为何会弹出两个主程序窗口我也不是很清楚,但是release版本多进程模式下就正常了,只有一个主程序窗口。并且多进程模式下调用CefShutdown就是OK的,app也能够正常析构,而单进程模式调用CefShutdown会直接崩溃!
另外,官方文档上说release版本单进程不是很稳定,不建议使用单进程模式,但目前我还没发现什么问题