简介:友益文书8.7.5映山红心系黄英版是一套面向内容作者、站长及办公人员的EXE电子书制作工具,适合将图文资料整理、打包为可独立运行的电子书,也便于研究电子书生成流程与界面定制。压缩包共15个文件,约2.26MB,以可执行主程序为核心,并配有界面图标、主题样式、交互脚本、应用清单、帮助示例与说明文档,分别承担视觉呈现、页面交互、配置声明和使用提示等作用,结构紧凑,便于快速了解工具组成。已有379人学习,说明其在电子书制作与软件研究场景中具有一定关注度。读者可据此了解目录树组织、页面模板、主题外观和打包发布的基本构成,也可结合帮助示例与说明文字摸索界面定制、资源引用及独立电子书输出方式。破解版本仅供学习研究,适合需要轻量级电子书制作工具或希望分析同类软件实现思路的读者参考。
1. 编译机上好好的,发出去白屏:exe 电子书最容易栽在装完那一刻
上周帮人看一个分发事故:素材整理了两周,用友益文书 8.7.5 编译出的单文件 exe,在自己电脑上翻页、搜目录、看图全正常,发给十几个人,三个人打开是白板,两个人报「脚本错误」,还有一个直接被杀软隔离。重装了三遍工具也没用——问题根本不在安装,在编译机和阅读机的环境差。exe 电子书制作工具这类软件的安装,向导点下一步只占五分钟,剩下全是环境活:内核版本、字体、路径、临时目录、打包参数,任何一项没对齐,编译出来的书在别人机器上就是黑匣子。这篇按我自己装 8.7.5 的顺序,把装前清单、首次配置、素材与编译参数、翻车排查、验证方法一条条走完。适合要把 txt、doc、图片打包成单文件 exe 分发的资料整理岗和内部培训场景。
2. 装前清单:Windows 版本、内核组件与路径这四项先确认
安装包双击之前,先把这台机器的底摸清。友益文书 8.7.5 本身是个体积不大的原生程序,装起来快,但它依赖的东西分布在系统各处,出问题时表现又都像「软件坏了」,很容易把排查方向带偏。我一般先花十分钟做四项确认:系统版本与位数、mshtml 内核组件、磁盘路径长度、当前用户权限。这四项过关,后面九成的玄学问题不会出现。
2.1 系统版本与位数:32 位程序跑在 64 位系统上的两个真实后果
这类电子书编译工具主体基本是 32 位原生程序,在 64 位 Win10、Win11 上通过 WOW64 层运行,界面和功能都正常,但有两个后果必须提前知道。第一是地址空间:32 位进程可用内存远低于 4GB,实际能稳定吃下的素材总量通常在几百 MB 量级,素材一多就卡在编译进度条末端。第二是文件系统重定向:程序往 System32、Program Files 写文件会被悄悄转到别处,你改的模板看似保存成功,下次启动又变回原样。
版本下限按 Win7 SP1 起算比较稳,我自己的编译机固定在 Win10 21H2 以上,Win11 也跑得通,但 Win11 上要多做一步内核确认(见下一节)。位数不用纠结,64 位系统直接装 32 位程序即可,不需要找所谓的 64 位版本。
# 确认系统版本、内部版本号与位数,输出结果对照下面的判断标准 $os = Get-CimInstance Win32_OperatingSystem [PSCustomObject]@{ Caption = $os.Caption # 例如 Microsoft Windows 10 专业版 Version = $os.Version # 10.0.19044 这类内部版本号 Build = $os.BuildNumber # 19044 / 22000 / 22621 OSArch = $os.OSArchitecture # 64 位 / 32 位 FreeSpace = [math]::Round((Get-PSDrive C).Free / 1GB, 1) # C 盘剩余 GB } | Format-List判断标准很直接:Build低于 7601 的老系统不要装了,缺少后续补丁会导致预览控件加载失败;FreeSpace低于 20GB 的先清盘,编译过程中会在临时目录生成接近成品体积的中间文件,空间不够会以「编译失败」的名义报出来,实际是磁盘写满。最后一行不是凑数,我在一台只剩 3GB 的机器上排了两个小时,最后发现是临时文件写不进去。
2.2 内核组件确认:mshtml 与 IE 模式在 Win10/Win11 上还剩什么
exe 电子书的阅读界面绝大多数是基于 WebBrowser 控件渲染的,底层就是 mshtml.dll。Win11 已经把 IE11 桌面应用退役了,但 mshtml.dll 这个组件仍然留在系统里,所以书能打开;问题在于控件默认可能以 IE7 兼容模式渲染,你排版时用的 flex、圆角、自定义字体全部失效,预览里看着正常是因为编译机注册表里有别的程序留下的兼容性设置。
先确认组件在不在、版本是多少:
# 检查 mshtml 内核组件是否存在及其文件版本 $dll = Join-Path $env:SystemRoot "System32\mshtml.dll" if (Test-Path $dll) { $v = (Get-Item $dll).VersionInfo "存在: $dll" "文件版本: $($v.FileVersion)" # 11.x 开头说明 IE11 内核仍在 "产品版本: $($v.ProductVersion)" } else { "缺失: 系统被精简过,预览和阅读都会失败,需要修复系统组件" }FileVersion显示 11.x,说明内核还在,可以继续。显示为空或者文件不存在,说明这台机器是被精简过的镜像,装完工具点预览会直接报错,别浪费时间调模板,先修系统。
接着把当前程序的内核模拟模式写进注册表。这个键是每个 exe 单独生效的,值11001表示强制用 IE11 标准模式,11000是 IE10 标准模式,老模板用11000反而更稳。
# 为编译工具指定 IE11 标准渲染模式,避免预览与实际输出不一致 $exeName = "YouyiBook.exe" # 换成安装目录里实际的主程序文件名 $key = "HKCU:\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION" if (-not (Test-Path $key)) { New-Item -Path $key -Force | Out-Null } New-ItemProperty -Path $key -Name $exeName -Value 11001 -PropertyType DWord -Force | Out-Null Get-ItemProperty -Path $key -Name $exeName键写在HKCU下,只对当前用户生效,不需要管理员权限,出问题删掉这一项就恢复原状,比改 HKLM 安全得多。注意程序名必须与实际 exe 完全一致,包括大小写,写错了不生效而且不报错——这是最容易白忙一场的地方。改完必须完全退出程序再启动,托盘里残留的进程不算退出。
2.3 路径与权限:中文路径、空格、260 字符三项检查
安装路径这条建议听起来老套但每次事故都能对上号:不要装进Program Files,不要放在带中文和空格的目录下,整条路径控制在 60 个字符以内。原因不是程序不支持中文,而是编译过程中会把相对路径拼成绝对路径传给内核去加载资源,路径里一旦有空格没转义,图片就变成红叉。
我固定的目录约定是这样,装在 D 盘一个短名字目录下:
# 建立规范的三段式目录:程序、工程、输出互相分离 $root = "D:\BookTools" # 根目录,短、纯英文、无空格 $dirs = @( "$root\Youyi875", # 程序安装目录 "$root\Projects", # 工程文件(.wy 之类)集中放这里 "$root\Output", # 编译产物 "$root\_TemplateBak" # 模板原样备份,改坏了好回滚 ) foreach ($d in $dirs) { if (-not (Test-Path $d)) { New-Item -ItemType Directory -Path $d -Force | Out-Null } "OK $d 长度=$($d.Length)" }每个目录各管一件事,好处是升级或重装程序时直接删Youyi875,工程和模板备份都还在。脚本里把路径长度打出来是习惯动作,超过 60 就要警惕,超过 200 基本可以肯定会踩到 260 字符上限——素材目录层级一深,加载附件时就会报「找不到文件」,而文件明明躺在那里。
权限方面,用普通用户账户安装和运行即可,不要图省事全程管理员。管理员运行会让程序把配置写到管理员账户的配置目录下,换成普通账户启动后所有设置凭空消失,看起来像「配置不保存」的 bug。
2.4 版本取舍:8.7.5 与旧版之间该怎么选
8.7.5 相比更早的版本,主要价值在模板结构和输出格式的支持范围上,对新系统也更友好。但升级不是无脑的,如果手上已经有一套跑了很多项目的旧模板,直接拿新版打开有可能出现目录层级错位、样式丢失。我的做法是先在 8.7.5 里用旧模板编译一个最小样例(三章、五张图),能正常翻页、目录能跳转,再决定把正式工程迁过来。
另一个必须说的是安装包来源。网上流传的一些所谓改动版安装包,常见问题是模板目录被替换、精简掉了预览组件、夹带额外的东西,装完能启动,但编译出来的书在别人机器上白屏或者被杀软拦。判断方法很简单:解压后看文件清单,正常的安装包目录结构完整、模板文件夹里有成套文件;再看安装后主程序目录的大小和文件数,跟官方说明对不上就别用。花十分钟核对,比后面查三天白屏划算。
3. 安装与首次启动:路径、字体、临时目录三处必须改
安装过程本身没什么可讲的,值得写的是装完之后那十分钟的配置。默认配置是按开发者的机器假设的:字体用系统默认、临时目录用%TEMP%、预览用兼容模式。这三项在你的机器上大概率不对,而且不对时的表现全都不是报错,是「看起来正常,发出去不对」,属于典型的后悔药场景。
3.1 安装包落地与目录核对
拿到安装包先别双击。丢到一个临时目录解压开,看一眼结构,确认模板文件和主程序都在,再执行安装。
# 解压到临时目录并列出关键文件,确认包结构完整 $pkg = "D:\Download\youyi875.zip" # 换成实际安装包路径 $tmp = "D:\Download\_unpack" Expand-Archive -Path $pkg -DestinationPath $tmp -Force Get-ChildItem $tmp -Recurse -File | Where-Object { $_.Extension -in ".exe",".dll",".chm",".css",".html" } | Select-Object @{n='相对路径';e={$_.FullName.Replace($tmp,'')}}, Length | Sort-Object 相对路径 | Format-Table -AutoSize这一步看三样:主 exe 在不在最外层、有没有独立的模板或皮肤目录、有没有多余的 exe。正常的包应该只有一个主程序,多出来的可执行文件不管叫什么名字都值得警惕。模板目录里如果只有一两个文件,说明模板被精简过,编译出来的书样式会很单调,而且缺的样式在预览里看不出来。长度列用来估算体积,主程序加资源通常是几十 MB 量级,明显偏小就要怀疑被裁过。
3.2 安装路径的选择与写入验证
安装向导走到路径那一步,手动改成 2.3 节建好的D:\BookTools\Youyi875。不要接受默认的C:\Program Files (x86)\...。装完之后立刻验证程序有没有写权限,方法是在程序目录里建一个测试文件:
# 验证安装目录可写,避免模板修改被 UAC 虚拟化重定向 $app = "D:\BookTools\Youyi875" $probe = Join-Path $app "_write_test.txt" try { "probe" | Out-File -FilePath $probe -Encoding ASCII -ErrorAction Stop "可写: $app" Remove-Item $probe -Force } catch { "不可写: $($_.Exception.Message) —— 换目录重装,别用管理员权限硬顶" } # 顺带确认没有写到虚拟化目录里 $virt = "$env:LOCALAPPDATA\VirtualStore" if (Test-Path $virt) { Get-ChildItem $virt -Recurse -Depth 2 -ErrorAction SilentlyContinue | Select-Object FullName }第一段判断当前用户对这个目录有没有直接写权限。写不进去的时候不要用「以管理员身份运行」绕过去,那样配置会跟着管理员账户走,换账户就丢。第二段是查 UAC 虚拟化留下的痕迹,如果VirtualStore下面出现了这个程序的目录,说明之前的运行已经发生了重定向,模板的修改实际写到了那里,程序目录里的文件根本没变——这个坑非常隐蔽,现象是「改了模板,重开又回去了」。
3.3 首次启动的三处设置
程序第一次启动,进设置里改三样,改完重启程序确认生效。
第一处是默认字体。不要用「微软雅黑」这类在新系统上才普及的字体,读者的机器可能是老系统或者精简系统,缺字体时会回退成宋体,行距和字宽全变,排版挤成一团。稳妥做法是正文用宋体、标题用黑体,这两款在 Windows 上几乎不会缺。设置里如果有「嵌入字体」选项,视体积决定,中文字体嵌进去动辄十几 MB。
第二处是临时目录。默认的%TEMP%可能落在C:\Users\张三\AppData\Local\Temp这种带中文用户名的路径下,编译中间文件和素材拼接时容易出编码问题。改成固定短路径:
# 建立专用临时目录,并在环境变量层面指向它(只影响当前用户) $tmp = "D:\BookTools\_Temp" New-Item -ItemType Directory -Path $tmp -Force | Out-Null [Environment]::SetEnvironmentVariable("TEMP", $tmp, "User") [Environment]::SetEnvironmentVariable("TMP", $tmp, "User") "已设置 TEMP/TMP -> $tmp (需重新登录或重启程序生效)"改用户级环境变量对系统其他程序影响有限,但保险起见,如果这台机器还要跑别的构建任务,就只在电子书工具的设置界面里单独指定临时目录,不动环境变量。改完记得清一次目录,之前失败留下的半成品文件会干扰下一次编译。
第三处是预览内核。2.2 节写注册表是全局手段,程序设置里如果自带「预览内核 / 渲染模式」下拉项,优先用程序内的设置,它对当前工程单独生效,不影响别的软件。两者都设置时以程序内设置为准。
3.4 用一个最小样例验证安装是否成功
配置改完不要直接上正式工程,先做一个三章的最小样例:一个封面、两章正文、一张图、一个内部跳转链接。编译一次,输出到D:\BookTools\Output,双击打开。
验证点按顺序过一遍:封面图能不能显示、目录树能不能展开、点目录能不能跳到对应章节、翻页按钮是否正常、图片是否清晰、关闭再打开是否记住上次阅读位置。六项全过说明安装和基础配置没问题,可以进正式工程。任何一项不过,先回 2.2 查内核,再看临时目录里有没有残留文件。
提示:最小样例保留下来别删,后面每次升级版本或换机器,都拿它先跑一遍,五分钟能省掉半天。
4. 素材与编译:从散装文件到能发出去的单文件 exe
工程能做多大,取决于素材整理得多规矩;成品能不能发出去,取决于编译参数怎么设。这一章是整篇里最费时间的部分,因为大部分翻车不是装错,是素材和参数没对齐。
4.1 素材规范化:txt 编码、图片尺寸、文件名
文本编码是最常见的第一道坎。老的电子书工具读 txt 默认按 GBK/ANSI 解释,素材如果是 UTF-8 无 BOM,打开就是满屏问号;反过来,工具按 UTF-8 读而文件是 GBK,也是一堆乱码。稳妥做法是统一转成 UTF-8 带 BOM,绝大多数版本能正确识别,实在不行再退回 GBK。
# 批量把素材 txt 转成 UTF-8 with BOM,并统计异常文件 import pathlib src = pathlib.Path(r"D:\BookTools\Projects\demo\src") report = [] for f in src.rglob("*.txt"): raw = f.read_bytes() for enc in ("utf-8-sig", "utf-8", "gb18030"): try: text = raw.decode(enc) break except UnicodeDecodeError: continue else: report.append((f.name, "无法识别编码")) continue # utf-8-sig 写入会自动加 BOM,保证工具能识别编码 f.write_text(text, encoding="utf-8-sig") report.append((f.name, f"源编码={enc} 字符数={len(text)}")) for name, msg in report: print(f"{name:<40}{msg}")逐个尝试utf-8-sig、utf-8、gb18030三种编码解码,第一个成功的就用它,然后统一写成带 BOM 的 UTF-8。gb18030放在最后作为兜底,它能覆盖绝大部分 GBK 内容,但会有极小概率把二进制文件误判成文本,所以只对*.txt跑。输出的报告里如果有「无法识别编码」,那多半不是文本文件,改名后缀或者手工处理,不要硬转。
图片方面,阅读界面是 32 位进程内嵌浏览器控件渲染的,单张图超过 3MB、总图片超过 200MB,翻页就会明显卡顿,编译阶段也容易卡在进度条末端。批量压一下:
# 批量压缩图片:长边限制 1600px,JPEG 质量 82,原图另存备份 import pathlib from PIL import Image src = pathlib.Path(r"D:\BookTools\Projects\demo\images") bak = src.parent / "images_raw" bak.mkdir(exist_ok=True) for f in list(src.glob("*")): if f.suffix.lower() not in (".jpg", ".jpeg", ".png", ".bmp"): continue before = f.stat().st_size im = Image.open(f) im = im.convert("RGB") if f.suffix.lower() != ".png" else im im.thumbnail((1600, 1600), Image.LANCZOS) # 长边压到 1600,等比缩放 out = f.with_suffix(".jpg") if f.suffix.lower() != ".png" else f im.save(out, quality=82, optimize=True) # 质量 82 是清晰度与体积的平衡点 after = out.stat().st_size print(f"{f.name:<30}{before//1024}KB -> {after//1024}KB")thumbnail是等比缩放并且会就地修改尺寸,不会拉伸变形;quality=82是反复试出来的平衡点,再低文字截图边缘会出现明显噪点,再高体积降不下来。原图没有自动搬走,脚本里留了备份目录变量,实际使用时先把原图复制一份过去再跑,避免压过头无法回退。
文件名只用英文、数字、下划线和中划线,不要用空格、括号、井号。这些字符在内部链接和资源引用里都会被转义,转义一旦漏掉就是图片裂开。
4.2 章节树:层级、命名与排序
章节树的层级建议不超过三层:卷、章、节。再深目录面板就要滚动,读者找不到位置。命名上加两位数字前缀保证排序稳定,01_、02_,不要依赖工具按名称自然排序,不同版本的排序规则不完全一致。
每章一个独立目录,正文和这一章的图片放一起,目录结构就是书的结构:
# 工程目录结构示例,mkdir -p 一次建好骨架 mkdir -p D:/BookTools/Projects/demo/{src/ch01,src/ch02,src/ch03,images,template,out} # 章节目录带序号前缀,保证在不同排序规则下顺序一致 # src/ch01/ -> 第一章正文 + 该章专属图片 # images/ -> 全书公用图片(封面、图标、装饰) # template/ -> 模板文件副本,原件放 _TemplateBak工程和输出分离,out目录只放编译产物,每次编译前清空,避免旧文件混在里面导致「版本不对」的错觉。模板目录里放的是当前工程的模板副本,调样式只改这里,_TemplateBak里那份原封不动留着当后悔药——这句话不是客套,我至少两次因为改错一个 CSS 选择器导致整本书的标题全部消失,全靠备份五分钟恢复。
4.3 模板替换与样式覆盖的正确姿势
大多数模板由 HTML + CSS 组成,改样式只动 CSS,不要动结构文件里的占位标记。占位标记是程序编译时替换章节内容和目录的地方,删掉一个标签,整章内容就会消失,而且预览里不一定能立刻发现。
改之前先备份、再改、改完做差异对比:
# 备份模板并记录改动前后的差异,出问题能一眼看出改了啥 $work = "D:\BookTools\Projects\demo\template" $bak = "D:\BookTools\_TemplateBak\$(Get-Date -Format yyyyMMdd_HHmm)" New-Item -ItemType Directory -Path $bak -Force | Out-Null Copy-Item "$work\*" $bak -Recurse -Force "已备份到 $bak" # 改完样式后,对比备份与当前目录 Compare-Object (Get-ChildItem $bak -Recurse -File | Select-Object -Expand Name) ` (Get-ChildItem $work -Recurse -File | Select-Object -Expand Name)备份目录带时间戳,每次改之前跑一遍,历史版本都留着。对比那一步输出为空说明文件清单没变,只有内容变化;如果输出了多出来或者少掉的文件,先确认是不是误删。样式改动本身建议一次只改一处,改完立刻编译最小样例看效果——批量改完再编译,出了问题根本不知道是哪一行引起的。
另外一个常被忽略的点:模板里如果引用了外部字体、外部图片、CDN 上的样式表,读者断网打开就是默认样式甚至白屏。所有资源必须内嵌或用相对路径引用工程内的文件,编译前全文搜一遍http://和https://,有一个删一个。
4.4 编译输出参数:格式、图标、压缩与保护的取舍
编译对话框里的参数不多,但每一个都直接影响成品能不能用。
| 参数 | 可选值 | 实际影响 | 我的取值 |
|---|---|---|---|
| 输出形式 | 单文件 exe / exe + 数据目录 | 单文件方便分发,但体积大、启动慢;带数据目录启动快,但必须整个文件夹一起发 | 资料内部分发用单文件,超过 300MB 改带目录 |
| 压缩级别 | 不压缩 / 普通 / 最大 | 最大压缩能省 30% 左右体积,但编译时间和首次打开的解压时间都会翻倍 | 普通,体积换启动速度 |
| 程序图标 | ico 文件 | 影响观感和部分杀软的启发式判断,图标尺寸建议 256×256 多尺寸打包 | 256 多尺寸 ico |
| 打开密码 | 空 / 自定义 | 只是阅读门槛,不是加密,别放真正敏感的内容 | 对外分发时设,内部不设 |
| 窗口尺寸 | 固定 / 可调 / 最大化 | 固定尺寸在不同分辨率下可能显示不全 | 可调 + 初始 1024×768 |
| 分卷 | 关闭 / 按体积 | 单文件过大时用,但读者体验差,需要先把所有分卷放同一目录 | 尽量不分卷 |
关于压缩有一点要注意:最大压缩出来的单文件 exe,每打开一次都要先解压到临时目录,机械硬盘或者杀软实时扫描开着的情况下,首次打开可能要等十几秒,读者会以为程序卡死。普通压缩在绝大多数场景下是更好的选择。
编译前把上一次的输出清干净,避免拿错文件:
# 清空输出目录并编译后核对产物 $out = "D:\BookTools\Output" Get-ChildItem $out -File | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-1) } | Remove-Item -Force Get-ChildItem $out -File | Select-Object Name, @{n='大小MB';e={[math]::Round($_.Length/1MB,2)}}, LastWriteTime | Format-Table只删一天前的旧文件,是防止误删别人正在用的产物。编译完成后看输出的名字、体积、修改时间三项,体积明显偏小通常是素材没打进去,偏大通常是原图没压缩。
4.5 体积与内存:32 位进程的天花板在哪
单文件成品控制在 200MB 以内比较舒服,超过 500MB 就要考虑带数据目录的形式。原因在 2.1 节提过:32 位进程编译时要同时把素材读进内存、压缩、写盘,素材总量逼近内存上限时,表现是进度条卡在 90% 以上不动,任务管理器里内存占用顶到 1.5GB 左右,然后程序无响应。
真遇到超大素材,处理顺序是:先压图(通常能砍掉一半以上)、再拆分卷、最后才考虑换输出形式。不要先去改虚拟内存或者加大页面文件,那解决不了 32 位地址空间的硬限制。
5. 避坑与排查:五条翻车记录,每条都找得到根因
这一章的每条都是「现象看着像 A,实际是 B」的类型。按现象查,别按猜测查。
5.1 编译机正常,读者打开白屏
现象:自己机器上翻页、跳转全正常,发出去有人打开只有窗口背景,内容区一片白。
原因:读者的机器上内核渲染被策略限制,或者素材里有外部链接资源(http 图片、CDN 样式),断网或者内网环境下加载失败;还有一种情况是 Windows 的「阻止来自 Internet 的文件」标记,从网上下载的 exe 会被打上 Zone.Identifier,脚本直接被拦。
解决:编译前全文搜一遍外链并全部改成内嵌资源;分发时把成品打成 zip,让读者解压后再运行,解压过程会去掉部分标记;同时提供一句说明,告知若出现白屏右键属性点「解除锁定」。
5.2 成品被杀软直接隔离
现象:编译出来的 exe 在编译机上没事,发到别人机器上几秒钟内被删除或者隔离,日志里写「释放器」或者「可疑打包程序」。
原因:单文件电子书本质上是把一堆资源打包进一个 exe,运行时释放到临时目录再加载,行为特征和某些不受欢迎的程序高度相似;如果程序图标、版本信息缺失,启发式判断更容易命中。
解决:编译时填完整的版本信息(产品名、版本号、公司名留空也可以但别乱填),用正规的多尺寸 ico;分发给外部时打包成 zip 附一份说明;如果长期对外分发,考虑给 exe 做代码签名,签过名的文件误报率明显下降。不要试图通过改壳、加花指令来绕过,那只会让误报更严重。
5.3 中文目录下编译,图片全部显示不出来
现象:素材放在D:\资料\项目A\下面,编译能过,打开后文字正常,图片位置全是红叉。
原因:渲染层加载本地资源时对路径做了 URL 解析,中文和空格没有正确转义,请求直接失败。看起来是图片问题,其实是路径问题。
解决:整个工程迁到纯英文短路径下,如D:\BookTools\Projects\proj_a;文件名也一并改成英文数字下划线。迁移后重新编译,不要在原目录上改文件名试图绕过,缓存里的旧路径还在。
5.4 编译卡在 99% 不动
现象:进度条走到最后一段停住,界面无响应,等十分钟也没结果。
原因:三种可能——单张图过大(超过 20MB 的扫描图很常见)、素材总量逼近 32 位进程内存上限、临时目录所在磁盘空间不足。
解决:按顺序排查,先看任务管理器里进程内存是否顶到 1.5GB 以上(是则压图分批),再看临时目录所在盘剩余空间(低于成品预估体积的两倍就会失败),最后清空临时目录重试。清临时目录这一步经常被跳过,但失败留下的半成品文件会导致每次重试都在同一个位置卡住。
5.5 换了台机器,模板和设置全没了
现象:在 A 机器上配好的模板、字体、临时目录设置,复制程序目录到 B 机器后,打开全是默认值,模板也变回原样。
原因:程序的部分配置写在用户配置目录或者注册表里,不在安装目录下;如果之前用管理员权限运行过,配置还写到了管理员账户的配置目录下,普通账户启动自然读不到。
解决:迁移时同时带走安装目录、用户配置目录(一般在%APPDATA%和%LOCALAPPDATA%下的对应文件夹)、以及注册表里HKCU\Software下对应的项。统一用普通用户权限运行,避免配置分叉。迁移完成后按第 3 章的三处设置重新核对一遍,比事后查「为什么设置不生效」快得多。
6. 装完怎么验证:三机 + 一表,二十分钟闭环
编译出来的 exe 在编译机上跑通不算数,编译机的环境是最全的,什么都装过,什么问题都暴露不出来。我固定的验证方法是三台机器加一张检查表,二十分钟能跑完。
第一台是干净虚拟机,装好系统后什么都不装,不装 Office、不装运行库、不装任何浏览器插件,模拟最朴素的读者环境。第二台是实体机,Win11 最新补丁,开着杀软实时防护,验证误报和兼容性。第三台断网,验证有没有隐藏的外链依赖。三台机器上做同一套动作:双击打开、等首屏出现、展开全部目录、点三处跳转、翻十页、找一张图、用一次搜索、关闭再打开。
检查表按下面这几项对,不通过时按右列的顺序查:
| 检查项 | 判定标准 | 不通过先看什么 |
|---|---|---|
| 启动速度 | 干净环境 5 秒内出首屏 | 压缩级别是否设成了最大、临时目录是否在慢盘 |
| 首屏内容 | 封面与目录同时可见 | 模板占位标记是否被误删、外链资源是否残留 |
| 目录跳转 | 点任意章节能定位 | 章节树层级是否超过三层、锚点命名是否含特殊字符 |
| 图片显示 | 全部清晰无红叉 | 路径是否纯英文、单图是否超过 3MB |
| 搜索 | 关键词能命中且高亮 | 编码是否统一为 UTF-8 BOM |
| 断网打开 | 内容完整无缺 | 是否存在 http 外链 |
| 杀软扫描 | 不被隔离 | 版本信息、图标是否完整 |
最后一台机器上跑一遍启动耗时记录,方便对比不同压缩级别的差异:
# 记录成品在干净环境下的启动耗时,用于对比压缩级别的影响 $exe = "D:\BookTools\Output\demo_book.exe" $times = 1..5 | ForEach-Object { $sw = [System.Diagnostics.Stopwatch]::StartNew() $p = Start-Process -FilePath $exe -PassThru Start-Sleep -Milliseconds 300 $p.WaitForInputIdle(15000) | Out-Null # 等主窗口进入可交互状态 $sw.Stop() Start-Sleep -Seconds 2 $p.CloseMainWindow() | Out-Null $p.WaitForExit(5000) | Out-Null [math]::Round($sw.Elapsed.TotalSeconds, 2) } "五次启动耗时(秒): $($times -join ', ')" "平均: $([math]::Round(($times | Measure-Object -Average).Average, 2)) 秒"WaitForInputIdle等的是窗口进入可交互状态,比单纯等进程启动更贴近读者的真实感受;等待上限设 15 秒,超时说明首屏加载有问题,直接判定不通过。跑五次取平均,避开首次运行的磁盘缓存影响。如果平均超过 5 秒,把压缩级别从最大降到普通再测一次,通常能省一半时间。
三台机器全部过完,再算一次产物的哈希留档,以后有人反馈「打开不对」,先对哈希确认拿到的是不是同一个文件:
# 产物留档:哈希 + 体积 + 编译时间,写进随包说明 $f = Get-Item "D:\BookTools\Output\demo_book.exe" $h = Get-FileHash $f.FullName -Algorithm SHA256 [PSCustomObject]@{ 文件 = $f.Name 大小MB = [math]::Round($f.Length/1MB, 2) SHA256 = $h.Hash.Substring(0,16) + "..." 编译于 = $f.LastWriteTime } | Format-List哈希只取前 16 位写进说明文档就够用,完整值留在自己的记录里。这个习惯救过我一次:对方坚持说文件有问题,一比哈希发现他打开的是上一版,白查半天。
从那以后我每次编译完,不管多急,都强制走一遍断网虚拟机加杀软实机这两步,宁可晚发半天,也不发一个「在我这儿是好的」出去。这套 8.7.5 的安装包、模板备份目录和上面的检查脚本我整理在一起了,照着第 2 章的清单对一遍环境再动手,能少走不少弯路。希望帮到你。
本文还有配套的精品资源,点击获取