CefInitialize崩潰 && Cef白屏

转载自:https://www.itread01.com/content/1545912422.html

新建一個MFC Dialog工程,然後仿照CefSimple模仿實現自己的一個基於MFC視窗的Demo(具體程式碼稍後上),注意我僅僅只配置了所需要依賴的lib,並沒有把CefSample的配置一起Copy,所以才導致後面的白屏,浪費了我一天時間。
坑一:CefInitialize崩潰
也許這個坑很多網友都遇到過,所以尋找度孃的時候問題很快就解決了,就是exe執行環境缺少必須要的資源包(不僅僅dll,所以圖方便我們直接從CefSimple環境拷貝出來)。
在這裡插入圖片描述
坑二:Cef白屏
當出現白屏的時候我第一反應就是程式碼有bug,於是我從MFC工程切換到win32工程,從子視窗切換到Popup,各種嘗試都不行,最後我把CefSimple整個工程拷貝過來,然後按照我的配置修改編譯依舊白屏,此刻問題基本確定:工程配置不對。但是工程配置有什麼不對呢?只能一點點的比較,終於在最後發現:後期生成事件沒有配置。命令如下:

setlocal
mt.exe -nologo -manifest "H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/tests/cefsimple/cefsimple.exe.manifest" "H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/tests/cefsimple/compatibility.manifest" -outputresource:"E:/project/CefDemo/x64/Debug/cefsimple.exe";#1
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/chrome_elf.dll E:/project/CefDemo/x64/Debug/chrome_elf.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/d3dcompiler_43.dll E:/project/CefDemo/x64/Debug/d3dcompiler_43.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/d3dcompiler_47.dll E:/project/CefDemo/x64/Debug/d3dcompiler_47.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/libcef.dll E:/project/CefDemo/x64/Debug/libcef.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/libEGL.dll E:/project/CefDemo/x64/Debug/libEGL.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/libGLESv2.dll E:/project/CefDemo/x64/Debug/libGLESv2.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/natives_blob.bin E:/project/CefDemo/x64/Debug/natives_blob.bin
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/snapshot_blob.bin E:/project/CefDemo/x64/Debug/snapshot_blob.bin
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/v8_context_snapshot.bin E:/project/CefDemo/x64/Debug/v8_context_snapshot.bin
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_directory H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/swiftshader E:/project/CefDemo/x64/Debug/swiftshader
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/cef.pak E:/project/CefDemo/x64/Debug/cef.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/cef_100_percent.pak E:/project/CefDemo/x64/Debug/cef_100_percent.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/cef_200_percent.pak E:/project/CefDemo/x64/Debug/cef_200_percent.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/cef_extensions.pak E:/project/CefDemo/x64/Debug/cef_extensions.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/devtools_resources.pak E:/project/CefDemo/x64/Debug/devtools_resources.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/icudtl.dat E:/project/CefDemo/x64/Debug/icudtl.dat
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_directory H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/locales E:/project/CefDemo/x64/Debug/locales
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd

上面命令主要實現兩個功能:
1.將manifest 檔案嵌入到exe內部。
2.將所依賴的檔案copy到執行環境(所以如果配置了這個生成後事件,那麼問題一就不需要手動拷貝依賴項了)。

manifest 檔案學習參考:

  1. 什麼是vs 程式的manifest檔案
  2. exe或者dll 嵌入manifest檔案方法
  3. VS2008 manifest檔案簡單應用

所以白屏的根本原因是缺少manifest檔案,導致執行的時候出問題。
解決方法兩種:

  1. 把上面的程式碼完整Copy到生成後事件裡面去【記得修改自己的工程目錄
  2. 如果之前已經把必要的檔案和資源Copy到了執行環境,那麼我們只需要Copy如下一段程式碼就OK啦(功能就是把manifest檔案嵌入exe內部)【記得修改自己的工程目錄】:
setlocal
mt.exe -nologo -manifest "H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/tests/cefsimple/cefsimple.exe.manifest" "H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/tests/cefsimple/compatibility.manifest" -outputresource:"E:/project/CefDemo/x64/Debug/cefsimple.exe";#1
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd

下一章節將描述如何把Cef作為一個子視窗整合到MFC工程和win32工程。

猜你喜欢

转载自blog.csdn.net/ayang1986/article/details/86553335
CEF