vs2019编译器在哪个文件夹_使用CEF(2)— 基于VS2019编写一个简单CEF样例

本文详细介绍了如何在Windows下使用VS2019创建一个基于CEF的C++桌面应用程序,包括项目创建、依赖库的添加、代码编写与问题解决,特别是针对运行时库冲突和CEF的manifest文件问题给出了解决方案。
摘要由CSDN通过智能技术生成

使用CEF(2)— 基于VS2019编写一个简单CEF样例

在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进行修改配置和代码编写,并在这个过程中介绍vs使用过程中和C++项目的结合。源码见文章末尾Github链接。

前提

你已经阅读过《使用CEF(1)— 起步》,你可以在这些地方读到:知乎链接、cnblogs。或,你知道如何获得libcef的库以及libcef_dll_wrapper静态库。

文件准备

接下来,本人将以Debug的模式下完成代码的开发工作。在Release下是同样的步骤,但是需要注意的是你所选择的目标是Debug或是Release都需要和libcef库以及libcef_dll_wrapper完全一致。

  • 现在,你需要libcef库文件相关文件,它来自于:

b7e8f34454002ec938b074c414433cf2.png
  • 你需要使用libcef_dll_wrapper静态库文件,它来自于你编译出来的静态库:

27fb6664596c68e844db6909ce85df48.png
  • 你需要libcef与wrapper的include文件,它来自于:

c7c9bbf3d25b0a942a5dfa313f2fbf4b.png

接下来我们创建一个名为cef的文件夹,并且把上述提到的文件夹和文件放到该目录下:

cef
│  libcef_dll_wrapper.lib
│  libcef_dll_wrapper.pdb
│
├─Debug
│  │  ......
│  │  libcef.dll
│  │  libcef.lib
│  │  libEGL.dll
│  │  libGLESv2.dll
│  │  ......
│  │
│  └─swiftshader
│          libEGL.dll
│          libGLESv2.dll
│
└─include
    │  cef_accessibility_handler.h
    │  cef_api_hash.h
    │  cef_app.h
    │  cef_audio_handler.h
    |  .....

97bbd403c8ecb8282d48f57715afc7d8.png

基础文件创建完成后,我们开始编写一个简单的基于CEF的程序吧!

项目创建

创建一个Windows桌面应用程序

44b299f5e34058a765532bc23df3dd8b.png

创建一个名为simple-cef的项目

d5a7e3124a34d16c48a2a13eadfca78d.png

创建完成后,我们删除所有模板生成的代码,得到一个完全空白的应用程序项目:

ef676e867400fae1e4563e34bf3c360b.png

依赖添加

头文件添加

众所周知,C/C++头文件作为声明定义,对于编译过程有着举足轻重的位置。当我们引入CEF编译我们的项目时候,首先需要include正确位置的头文件,才能实现编译(狭义的编译,不包括链接)。我们首先把上述做好的cef文件夹放到项目所在目录下,也就是说我们把cef的inlucde头文件以及静态库文件全都加到了项目中:

ea1398fc934534ed86e353fa28745596.png

然后,在VS中,我们通过如下的方式为我们的项目引入CEF的头文件:

右键项目propertiesC/C++GeneralAdditional Include Directories

PS:如果你发现没有C/C++分类,是因为你没有创建任何的源代码文件,官方FAQ。所以我们在Source Files目录下先创建一个main.cpp,然后继续上述的配置。

4ffedbdbf6f3eba5eb2b8b663e71e7a1.png

PS:这里本人使用了$(ProjectDir),它是一个VS宏变量,返回项目所在目录(即,vcxproj所在目录),且目录末尾带反斜杠。从上面的Evaluated value里面展示的经过实际计算得到的值,可以验证我们配置是否正确。这里正确的返回了我们放在项目目录下的cef文件夹

这里只需要添加到cef文件夹这一层级,是因为cef/include里面的头文件在include的时候,采用了对应的"include/xxx.h",即需要从引入目录中找到include文件夹,里面查找xxx.h头文件。当我们指定到了cef层级后,就能够使得编译器正确处理cef头文件中include的位置。

这里以$(ProjectDir)cef/include/cef_broweser.h这个头文件举例:

0ed6ad257920c49abfc7991d012a4017.png

当编译器发现里面的#include预编译命令后,会从头文件目录中去查找,即希望从上述配置的$(ProjectDir)cef/以及默认目录下查找,默认的项目目录应该是找不到了,但是可以在$(ProjectDir)cef/目录下找到include/cef_base.h等文件,因为$(ProjectDir)cef/include/cef_base.h确实是正确的文件路径。因此,上述额外的include文件夹只需要指定到cef层级即可。

库文件添加

完成头文件的添加后,我们还需要添加链接目标,即cef的静态库。添加方式为:

propertiesLinkerInputAdditional Dependencies

9b31f573049f754c2e551c72626cf2cd.png

同样使用宏变量来指定对应的lib静态库:libcef_dll_wrapper.lib、libcef.lib、cef_sandbox.lib。

通过上述的库文件添加,我们就完成了编译(狭义,头文件查找)——链接(库文件链接)这两个步骤的配置了,接下来就是进一步,开始我们的代码编写之路。

代码编写与说明

CEF的整体架构以及CefApp以及CefClient的概念可以参考该仓库里面的文档,或者是阅读官方文档。接下来将使用cefsimple代码进行解释说明,并适当增加一些小的细节。

simple_app

simple_app.h

#ifndef SIMPLE_APP_H
#define SIMPLE_APP_H
#pragma once

#include "include/cef_app.h"

// Implement application-level callbacks for the browser process.
class SimpleApp : public CefApp, public CefBrowserProcessHandler {
    
public:
    SimpleApp();

    // CefApp methods:
    virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler()
        OVERRIDE {
    
        return this;
    }

    // CefBrowserProcessHandler methods:
    virtual void OnContextInitialized() OVERRIDE;

private:
    // Include the default reference counting implementation.
    IMPLEMENT_REFCOUNTING(SimpleApp);
};

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CEF(Chromium Embedded Framework)是一个用于开发嵌入式浏览器的开源框架。CEF 可以在 C++、C#、JavaScript 和 Delphi 等语言中使用,但这里以 C 语言为例。 首先,你需要安装 CEF 的开发包,然后在 C 程序中包含 cef.h 头文件: ```c #include "cef.h" ``` 接下来,需要定义一个 CefApp 类的子类,并实现其中的一些回调函数。这些回调函数可以被 CEF 调用,以响应特定事件,如浏览器初始化、加载页面、接收到 JavaScript 请求等。 ```c class MyCefApp : public CefApp { public: virtual void OnBeforeCommandLineProcessing( const CefString& process_type, CefRefPtr<CefCommandLine> command_line) OVERRIDE { // 在这里可以修改 CEF 的命令行参数 } virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler() OVERRIDE { return this; } virtual void OnContextInitialized() OVERRIDE { // 在这里可以创建浏览器窗口 } }; ``` 最后,需要调用 CefExecuteProcess() 和 CefInitialize() 函数来初始化 CEF。 ```c int main(int argc, char* argv[]) { CefMainArgs main_args(argc, argv); // 处理 CEF 的命令行参数 CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine(); command_line->InitFromString(::GetCommandLineW()); // 创建 MyCefApp 实例 CefRefPtr<MyCefApp> app(new MyCefApp()); // 初始化 CEF CefInitialize(main_args, *command_line, app.get(), NULL); // 运行 CEF ### 回答2: CEF(Chromium Embedded Framework)是一款基于谷歌开源的Chromium项目的嵌入式浏览器框架。用C语言编写CEF样例可以按照以下步骤进行: 1. 下载和配置CEF:首先从CEF官方网站(https://cefproject.github.io/)下载适合你的操作系统和编译器CEF版本,并将其解压到你的项目文件夹中。 2. 创建C文件:在项目文件夹中创建一个新的C文件,例如main.c。 3. 引入CEF库和头文件:在main.c文件中使用#include指令引入CEF库和头文件,以便能够调用CEF的功能和API。 4. 编写CEF初始化代码:在main函数中编写CEF初始化的代码,包括设置CEF的启动参数、初始化CEF框架、创建CEF进程等。 5. 创建CEF窗口:使用CEF的API创建一个新的窗口,并加载指定的URL或本地文件。 6. 处理CEF事件循环:使用CEF的API监听和处理CEF的事件循环,如鼠标点击、键盘输入等。可以编写自定义函数来处理不同的事件。 7. 释放CEF资源:在程序退出前,记得释放CEF的资源,包括关闭CEF窗口、关闭CEF进程等。 以下是一个简单CEF使用样例: ```c #include <stdio.h> #include <stdlib.h> #include <cef_app.h> #include <cef_browser.h> #include <cef_client.h> int main(int argc, char* argv[]) { CefMainArgs args(argc, argv); CefRefPtr<CefApp> app(new CefAppImpl()); // 初始化CEF框架 int code = CefExecuteProcess(args, app, NULL); if (code >= 0) { return code; } CefSettings settings; // 设置CEF启动参数 CefInitialize(args, settings, app, NULL); // 创建CEF窗口 CefWindowInfo windowInfo; // 设置窗口参数,例如窗口位置、大小等 CefBrowserSettings browserSettings; // 设置浏览器参数,例如是否启用JavaScript、Flash等 CefRefPtr<CefBrowser> browser = CefBrowserHost::CreateBrowserSync(windowInfo, new CefClientImpl(), "https://www.baidu.com", browserSettings, NULL); // 处理CEF事件循环 CefRunMessageLoop(); // 释放CEF资源 browser->GetHost()->CloseBrowser(true); CefShutdown(); return 0; } ``` 上述样例一个基本的CEF应用程序,它创建一个CEF窗口并加载百度的首页,然后监听和处理CEF的事件循环,最后退出程序时释放CEF的资源。当然,为了更好地理解CEF使用和功能,你需要深入研究CEF的API文档和示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值