一步步CEF(2)之编译ceflicent

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/ftpleopard/article/details/84871606

一步步CEF(1)之编译libcef_dll_wrapper.lib已经提供了c++的静态库,这次要将cefclient编译出来。这里要说明一下,如果仅仅将cefclient编译的话,没什么好说的,直接按上文提示拉进来,将相应的设置也类似设置就可以了。这里的cefclient我需要做一个程序内部通讯,需要用到CreateMapping,OpenMapping等(这个是共享内存,自行搜索,这里不介绍),因为需要处理实时的命令,那么就不能用“CefRunMessageLoop();”那么简单。

1.新建一个subProcess的工程,写一个很简单的程序,应该是用于渲染之类的。

SubProcess

这里的sub_process.cc可以直接将{CEF_SRC_Folder}\tests\cefclient\cefclient_win.cc复制过来,和上图一样写一个“int SubProcess(HINSTANCE hInstance, int nCmdShow)”函数,然后在wWinMain下调用“return client::SubProcess(hInstance, nCmdShow);”。这样生成一个subProcess.exe(后面主程序会自动调用的,Debug的时候不一定会用到,但是Release版本一定会)

降低编译难度,我在subProcess目录下新建了SRC子目录,然后将{CEF_SRC_Folder}\tests和{CEF_SRC_Folder}\include复制到SRC下面

subprocess files

然后将cefclient_win.cc,改为sub_process.cc,如上述改写。

再将tests下面的cefclient和shared的文件都拉进工程。配置大部分跟编译libcef_dll_wrapper.lib差不多,我贴一下截图,不再细说。注意:上图中的bmp.cpp和logger.cpp和MsgHandler.cpp属于个人测试,与subProcess无关。

sub1

包含目录=“$(SolutionDir);$(SolutionDir)$(ProjectName)\SRC;$(IncludePath)”

库目录=“$(SolutionDir)$(Configuration)\;$(LibraryPath)”

sub2

附加包含目录=“$(SolutionDir)$(Configuration)\;%(AdditionalIncludeDirectories)”

sub3

“预处理器”,“代码生成”,“高级”跟一步步CEF(1)之编译libcef_dll_wrapper.lib定义一样(不上图)

2.根据1的提示一样,新建一个CEF_APP项目,这个是主程序,我将celfclient_win.cc改为cef_app.cc,里面的实现也改了不是,这里面实现程序通讯功能。(属性和subProcess一样,我新建另一份,主要是不想和subProcess弄一块,可以加些自己的代码进去)

cef app 1

除了cef_app.cc和subProcess工程是不是很像?^_^。。。。

2-1.cef_app.cc代码直接沿用cefclient_win.cc,先要干掉“message_loop->Run();”,改为“while(1){...;CefDoMessageLoopWork();Sleep(10)}”,在循环里面实现实时监测共享内存的变化(本工程的实际情况)。

m1

2-2.将“int exit_code = CefExecuteProcess(main_args, app, sandbox_info);
        if (exit_code >= 0)
        {
        return exit_code;
        }”干掉,不然经常进不到while循环去,尤其是通过dll调用cef_app.exe的情况!但是仅仅删掉这个不能解决问题,因为这里有控制subProcess的进程部分代码,原代码是调用同名exe以达到启动渲染进程的,我们要手动给它造一个。

在“context->PopulateSettings(&settings);”后加上“
        wchar_t subProcessPath[MAX_PATH] = { 0 };
        GetModuleFileNameW(hInstance, subProcessPath, MAX_PATH);
        *(wcsrchr(subProcessPath, L'\\') + 1) = L'\0';
        const wchar_t *SUB_PROCESS_NAME = L"subProcess.exe";
        wcsncat_s(subProcessPath, MAX_PATH, SUB_PROCESS_NAME,
            wcslen(SUB_PROCESS_NAME));
        cef_string_from_wide(subProcessPath, MAX_PATH, &(settings.browser_subprocess_path));
”;

m2m3

这样改写,subProcess.exe就变成渲染进程,cef_app.exe就是主进程。经过这两处修改,就可以打造一个实时可控的cef程序,很有意思。

哦,差点忘记了,这样直接编译,虽然成功了,但是不能弹窗的。这个要先设置“属性->链接器->系统”,“子系统”=“窗口”;

system

第二就是要改root_window_win.cc的函数“void RootWindowWin::CreateRootWindow(const CefBrowserSettings& settings,bool initially_hidden) ”

create win

这个是读取源码里的资源的标题和类名,但是在我重新新建项目,如果按原代码的话,那肯定会得到空字符串,然后就创建窗口失败!(window_class很重要,为空的话,肯定不行的)

不过有点遗憾的是,我不能上传修改好的程序上来,属于公司的资源,暂时不能公开,有空的话,我改好一份精简的再上传。

猜你喜欢

转载自blog.csdn.net/ftpleopard/article/details/84871606