前端页面没有以「一堆 html/js/css 文件」的形式散在安装目录里,而是作为资源编进了 exe。这样用户拿到的就是一个可执行文件,不会出现「误删了某个 js 导致界面打不开」。
资源内嵌
static string ReadRes(const char* name) {
HMODULE h = GetModuleHandleW(nullptr);
HRSRC hr = FindResourceA(h, name, RT_RCDATA);
if (!hr) return "";
HGLOBAL hg = LoadResource(h, hr);
if (!hg) return "";
DWORD sz = SizeofResource(h, hr);
const char* p = (const char*)LockResource(hg);
return (p && sz) ? string(p, (size_t)sz) : string();
}| 资源名 | 对应文件 |
|---|---|
IDR_INDEX | index.html(整个界面,含内联的样式与渲染库) |
IDR_BRIDGE | cpp_bridge.js(桥接层) |
IDR_CSS | app.css |
取资源失败时回退到 exe 同目录读磁盘文件,方便开发期调试 —— 改前端不必每次都重新编译:
static string ServeFrontend(const string& path) {
const char* res = nullptr;
if (path == "/" || path == "/index.html") res = "IDR_INDEX";
else if (path == "/cpp_bridge.js") res = "IDR_BRIDGE";
else if (path == "/app.css") res = "IDR_CSS";
if (res) { string s = ReadRes(res); if (!s.empty()) return s; }
if (path.size() > 1) { // 回退磁盘(仅开发期会走到)
string s = ServeFile(g_exeDir + path);
if (!s.empty()) return s;
}
return "";
}桥接层:让同一份前端适配两种运行环境
前端本身可以在两种状态下工作 —— 有本机后端,或没有(纯网页版)。桥接层负责探测并切换:
var BASE = 'http://127.0.0.1:18889';
function post(path, data) {
return fetch(BASE + path, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data || {}),
}).then(function (r) { return r.json(); });
}
function enableCpp(info) {
if (started) return;
started = true;
MODE = 'qt'; // 复用前端已有的「本地操作」分支
window.CPP_BACKEND = true;
// 把原本走浏览器下载/内存的操作,改成调本机后端做真实文件与编译
Object.assign(webBridge, {
gen: async function (p) { var j = await post('/api/generate', {...}); ... },
renameAll: async function () { var j = await post('/api/rename', {...}); ... },
bigFile: async function () { var j = await post('/api/bigfile', {...}); ... },
...
});
}- 后端在线 —— 探到
127.0.0.1:18889就切换为本地模式,生成本机文件、调用本机 g++、打开本机对话框 - 后端不在 —— 保持纯网页模式:用浏览器存储与下载完成受限功能,页面依旧可用
八个功能模块
| 模块 | 内容 |
|---|---|
| 生成 | 随机生成、分组生成、大文件、批量改名、生成器代码模式 |
| 自编译 | 指定 AC 代码,批量产出 .out |
| 打包 ZIP | 选源目录与输出位置,一键压缩 |
| 实用工具 | 系统小工具集合 |
| 账号 | 注册、登录、设备激活、次数查询 |
| 私信 | 与其它用户收发消息 |
| AI 助手 | 双模式对话界面 |
| 设置 | g++ 路径、主题、云端配置 |