#include #include #include #include "sui_base_config.h" #include "sui_base_ex.h" #include "ctai.h" #include #include #include #include "QCefWidget/CefWidget.h" #define DEBUG_PRINT true void debug_print_argv(int argc, char *argv[]) { if (!argc) { return; } std::lock_guard lock(m_mutex); DWORD process_id = GetCurrentProcessId(); std::cout << "CurrentProcessId Argvs" << std::endl; for (int i = 0; i < argc; ++i) { std::cout << "Process ID:" << process_id << " Argv:" << i << ": " << argv[i] << std::endl; } } QString curExeDir() { return QDir::currentPath(); } void exsMkDir(QString Dir) { if (!QDir(Dir).exists()) { QDir().mkdir(Dir); } } bool exeCinfog(int argc, char *argv[]) { std::string ex_1 = "renderer"; std::string ex_2 = "utility"; for (int i = 0; i < argc; i++) { std::string arg = argv[i]; if (arg.find(ex_1) == std::string::npos || arg.find(ex_2) == std::string::npos) { return true; } } return false; } void initConfig(int argc, char *argv[], QCefConfig &config, QString currentDir) { // 检测自定义缓存路径 exsMkDir(currentDir + "/user"); exsMkDir(currentDir + "/user/userCache"); // 子进程路径和名字,可以利用本进程复用, // Mingw编译下多进程情况需要设置否则程序会退出因为无法拉起子进程 if (exeCinfog(argc, argv)) { config.setBrowserSubProcessPath(currentDir + "/ctai.exe"); } config.setRootCachePath(currentDir + "/user"); config.setCachePath(currentDir + "/user/userCache"); config.setResourceDirectoryPath(currentDir + "/cef_binary"); config.setLocalesDirectoryPath(currentDir + "/cef_binary/locales"); // 浏览器标识 config.setUserAgent("Mozilla/5.0 (Windows NT 10.0; CEF/3.2272.2035) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 SoftwareInformer/1.6.1400"); // 日志输出级别 config.setLogLevel(QCefConfig::LOGSEVERITY_VERBOSE); // 桥名字 config.setBridgeObjectName("CtaiClient"); // 内置的协议方案名称 config.setBuiltinSchemeName("Ctai"); // 无窗口渲染模式 // config.setWindowlessRenderingEnabled(true); // 远程Debug端口 // config.setRemoteDebuggingPort(9000); // 请求头的语言 config.setAcceptLanguageList("zh-CN"); // 允许忽略 localhost 上的 TLS/SSL 错误 config.addCommandLineSwitch("allow-insecure-localhost"); config.addCommandLineSwitch("ignore-certificate-errors-spki-list"); config.addCommandLineSwitch("ignore-ssl-errors"); // 单进程模式 // config.addCommandLineSwitch("single-process"); // 启用GPU加速 config.addCommandLineSwitch("enable-gpu"); // GPU加速合成 config.addCommandLineSwitch("enable-gpu-compositing"); // 在进程中使用GPU渲染-开启后只有一个进程 config.addCommandLineSwitch("in-process-gpu"); // 无头模式 // config.addCommandLineSwitch("headless"); // 密钥链 config.addCommandLineSwitch("use-mock-keychain"); // chrome运行时环境 config.addCommandLineSwitch("enable-chrome-runtime"); // Alloy 风格 config.addCommandLineSwitch("use-alloy-style"); // 离屏渲染 // config.addCommandLineSwitch("off-screen-rendering-enabled"); // 网络服务In进程 config.addCommandLineSwitchWithValue("enable-features", "NetworkServiceInProcess"); // 语言 config.addCommandLineSwitchWithValue("lang", "zh-CN"); // 跨域进行远程 // config.addCommandLineSwitchWithValue("remote-allow-origins", "*"); // 禁用沙盒 config.addCommandLineSwitchWithValue("no-sandbox", "ture"); // 渲染进程限制 config.addCommandLineSwitchWithValue("renderer-process-limit", "1"); // 外部消息循环 config.addCommandLineSwitchWithValue("external-message-pump", "false"); // 多线程消息循环 config.addCommandLineSwitchWithValue("multi-threaded-message-loop", "true"); } int main(int argc, char *argv[]) { if (DEBUG_PRINT) { debug_print_argv(argc, argv); } QApplication a(argc, argv); QCefConfig config; // 初始化上下文的配置 initConfig(argc, argv, config, curExeDir()); // 初始化浏览器上下文 QCefContext cefContext(&a, argc, argv, &config); CefWidget cw; cw.show(); qputenv("QT_QPA_PLATFORM", "windows:fontengine=freetype"); // 加载语言包 QTranslator qtBaseTranslator; if (!qtBaseTranslator.load(QStringLiteral(":/res/translator/qtbase_zh_CN.qm"))) { // 处理加载翻译文件失败的情况 qDebug() << "Failed to load translation file."; return -1; } a.installTranslator(&qtBaseTranslator); // 读取窗体的配置并初始化 sui_init_config(); ctai x; x.init_layout(); // 仅限于windows平台 #if defined(__WIN32__) x.title()->set_type(QD_TYPE::QD_EXIT); #endif x.show(); a.exec(); qDebug() << "EXIT"; return 0; }