YStudio Y++

资源目录与「嵌入 exe」

Y++ / YStudio 开发文档 · 一点滴

工程树 资源/ 下的文件可在 Release 打包时写入 exe(嵌入表 g_yppEmbeddedRes)。路径在代码里统一写成 :/相对资源路径

右键「嵌入 exe」

  • 仅 Release 配置生效(Debug 菜单灰掉,始终旁路到 exe 旁)。
  • 打包侧无扩展名白名单:任意已加入资源目录的文件(js / html / txt / dll / 图片 / db / yss…)均可嵌入。
  • 文件夹可整夹嵌入;对「📂 资源」根节点嵌入 = 整树嵌入(工程文件里记为空串,勿写成无效的 ".")。
  • 「批量嵌入 exe…」可多选。
  • 「添加资源文件…」过滤器已含常见类型;其它扩展名用 所有文件 (.)

外拷可运行(单 exe)

Release 且勾选嵌入后,整工程可只拷一个 exe(第三方运行库例外见下):

  1. 资源走 :/…(嵌入优先,无旁路文件也能跑)
  2. 主窗 .yssg_yppEmbeddedFormYss;控件表 / YSS 扩展 → g_yppEmbeddedFormControls / g_yppEmbeddedYssExt
  3. 次级窗载入)→ g_yppEmbeddedSecondaryForms[]:每窗含 controls / launchMeta / yssExt / yss,运行时优先读嵌入,失败再回退旁路
  4. Release 发布目录不再旁路拷贝 form_controls_*.binform_launch_*.txtform_yss_ext_*.bin(Debug 仍拷贝)
  5. 第三方如 libmysql.dll 会放到发布目录旁(未进嵌入表时须一并拷贝)

编译后可检查 发布/.../Release/._cache/embedded_payload.cpp

  • g_yppEmbeddedResCount 是否 > 0(资源树)
  • g_yppEmbeddedSecondaryFormCount 是否等于次级窗数量

运行时 :/ 读取

类型 嵌入后能否用 :/… 说明
图片 / YSS / 图标 YsRes_* / 控件属性
文本 / json / 读文件 / 到字节集 走嵌入表或旁路文件
JS类.加载(":/…") 读嵌入字节再执行
加载DLL(":/…") 先落地临时文件再 LoadLibrary;失败则内存加载
DLL_内存加载 / DLL_写出 原本就支持资源 URL
SQLite类.打开(":/…") 物化到临时文件后打开;写入不会改回 exe 内嵌数据
浏览器控件打开 html ✅(有限) 物化为临时 file://;页面内相对路径资源可能失效,建议内联或绝对 :/

推荐写法

JS类 eng
eng.加载(":/scripts/sign.js")

长整数 m = 加载DLL(":/dll/plugin.dll")

SQLite类 db
db.打开(":/data/demo.db", 真)   ' 嵌入库建议只读

读文件(":/cfg/app.json")

DLL 依赖较多时,也可 DLL_写出(":/dll/x.dll", 临时目录)加载DLL