简介:EmEditor 20.6.0 便携版面向 Windows 10 用户,尤其适合需要处理大体积文本或进行代码编辑的程序员、Web 开发者与高级办公人群,可替代系统记事本解决大文件卡顿、编码混乱等问题。压缩包共 160 个文件,约 17.44MB,以 94 个 dll 动态库为核心支撑界面与宏功能,另含 6 个 exe 主程序、14 个 ini 配置、9 个 jsee 脚本及 ico、txt、rtf 等辅助资源,并附带词典、HTML 校验插件与 cpp、css、py、java 等多语言模板文件。目前已有 307 人学习下载。便携版免安装即可运行,内置多语言语法高亮、UTF-8 与 GBK 等编码支持、拼写检查、HTML/CSS 校验及宏录制自动化能力,配合模板可快速生成常见代码结构,帮助读者在 Windows 10 下获得稳定高效的编辑体验。
1. 拿到 emed64_20.6.0_portable.zip 之后:先别急着双击那个 exe
如果你在 Windows 10 上折腾过电子病历编辑器或者医疗信息化相关的二次开发,大概率见过 emed64 这个名字。这次流出的 emed64_20.6.0_portable.zip 是一个免安装的绿色包,解压完直接跑,不用往注册表里写东西,也不用管系统里有没有装过运行库。对经常要在一台临时机器上验证功能、或者给客户做离线演示的人来说,这种 portable 形态比安装版省心得多——拷进 U 盘,插到另一台 Windows 10 上就能用,拔了不留痕。
但 portable 包有个通病:它把依赖都塞在目录里,路径写死得比较死。你要是解压到带中文或者空格的目录,启动时大概率会给你脸色看。所以这篇不是那种“下载完点下一步”的说明文,而是把我自己拆这个包、在 Windows 10 上跑通、以及帮别人排查启动失败时踩过的坑,按顺序讲一遍。适合两类人:一是想拿它做电子病历模板编辑和打印预览的临床信息科人员,二是要基于它做接口对接或二次开发的工程师。下面从目录结构开始拆。
2. 拆开 portable 包:目录结构、依赖项与 Windows 10 兼容性判断
2.1 解压后先看这三层目录,别被根目录的 exe 骗了
把 zip 解压到一个纯英文、无空格的路径,比如D:\tools\emed64。解压完根目录一般长这样(不同打包方式略有出入,但核心目录跑不掉):
emed64/ ├── emed64.exe # 主程序入口 ├── config/ # 配置目录,重点看 db.ini 和 print.ini │ ├── db.ini │ └── print.ini ├── runtime/ # 运行时依赖,portable 的核心 │ ├── msvcp140.dll │ ├── vcruntime140.dll │ └── ... ├── templates/ # 病历模板存放目录 │ ├── default/ │ └── custom/ ├── logs/ # 运行日志,启动失败先翻这里 └── resources/ # 图标、字体、打印驱动配置很多人拿到包第一反应是双击emed64.exe,然后弹一个“缺少 xxx.dll”就懵了。portable 包的设计逻辑是:主程序启动时优先从runtime/目录加载依赖,而不是系统System32。所以如果你把 exe 单独拖出来放到桌面,它找不到runtime/里的东西,必挂。正确做法是整个目录一起移动,快捷方式也只指向原目录里的 exe。
config/db.ini是第一个要看的文件。它决定了程序启动时连不连数据库、连哪个。如果是纯单机模板编辑,里面通常有一行mode=local;如果要连服务端,会有host=和port=。portable 包默认多半是 local 模式,但有些打包者会保留上一次的配置,导致你一启动就去连一个不存在的 IP,卡半天才报错。先把这个文件打开确认一遍,能省掉很多“程序无响应”的误判。
2.2 Windows 10 上跑 portable 包的依赖检查清单
Windows 10 自带 .NET Framework 4.8 和较新的 VC++ 运行库,但 portable 包不一定依赖系统那套。我一般按下面这个顺序确认环境,基本能覆盖 90% 的启动问题:
| 检查项 | 怎么看 | 期望结果 |
|---|---|---|
| 系统架构 | 设置 → 系统 → 关于 → 系统类型 | 64 位,因为包名带 64 |
| VC++ 运行库 | runtime/目录里有没有vcruntime140.dll | 有就不用装系统版 |
| 路径字符 | 解压路径是否含中文/空格 | 纯英文最佳 |
| 权限 | 是否放在C:\Program Files下 | 建议放 D 盘或用户目录 |
| 杀软拦截 | Windows Defender 隔离记录 | 把整个目录加白名单 |
这里重点说权限和杀软。portable 程序运行时要在自己目录下写logs/和临时文件,如果你把它塞进C:\Program Files,普通用户权限写不进去,表现就是启动到一半闪退,日志里写access denied。我一般直接放D:\emed64或者C:\Users\你的用户名\emed64,省事。杀软方面,因为它是绿色包、又带一堆 dll,Defender 有时会误报,先把整个目录加排除项再解压,比事后恢复隔离文件靠谱。
2.3 用命令行验证启动,比双击更容易看到报错
双击 exe 如果闪退,窗口一闪就没了,什么都看不到。我习惯用 cmd 或者 PowerShell 进到目录里启动,这样报错会留在控制台:
# 进入解压目录,注意路径替换成你自己的 cd /d D:\tools\emed64 # 直接运行主程序,让错误输出留在当前窗口 emed64.exe # 如果程序支持日志级别参数,可以加一个 verbose 看详细加载过程 emed64.exe --log-level=debug逻辑说明:第一行切到程序目录,保证相对路径runtime/和config/能被找到。第二行直接运行,如果缺 dll 或者配置解析失败,控制台会打印具体文件名或行号,比看闪退强。第三行的--log-level=debug不是所有版本都支持,但 20.x 一般有类似的日志开关,加上之后logs/目录里会多出详细加载记录,能看到它到底卡在哪个 dll 或者哪个配置项上。参数含义:--log-level控制日志冗余度,debug 最细,生产环境别开,会拖慢启动。
如果命令行里看到LoadLibrary failed with error 126,基本就是runtime/里缺了某个 dll,或者 dll 位数不对(32 位混进 64 位包)。这时候别去网上乱下 dll 补,直接重新解压一份完整的包,或者从同版本安装版里把runtime/整个拷过来。
3. 配置与模板落地:db.ini、print.ini 和模板目录怎么改才不翻车
3.1 db.ini 的三个关键参数:mode、host、template_path
config/db.ini是 portable 包能不能跑起来的第一道关。我见过太多人解压完直接双击,结果程序去连一个内网 IP,转圈转到超时。打开这个文件,重点看三行:
[database] mode = local host = 127.0.0.1 port = 5432 template_path = ../templates/default逻辑说明:mode决定数据来源,local表示用本地文件或内嵌库,remote表示连服务端。portable 包如果你只是自己编辑模板,改成local最稳。host和port只在mode=remote时生效,但有些版本即使 local 模式也会去 ping 一下 host,所以如果 local 模式下启动还是慢,把 host 改成127.0.0.1能减少 DNS 解析等待。template_path是模板目录的相对路径,默认指向templates/default,你可以改成../templates/custom来加载自己的一套模板,改完记得把模板文件放进去。
参数怎么改:如果你要连自己的测试库,mode改remote,host填数据库地址,port填实际端口。但注意,portable 包不一定带数据库驱动,连远程库之前先确认runtime/里有没有对应的libpq.dll或者oci.dll。没有的话,连远程就是白搭,老老实实用 local 模式。
3.2 模板目录的命名规则和加载顺序
templates/下面一般分default/和custom/。程序启动时会先读db.ini里的template_path,然后扫描该目录下所有.emt或.xml模板文件(具体扩展名看版本)。加载顺序通常是按文件名排序,所以如果你有多个模板,命名上最好带序号,比如01_入院记录.emt、02_病程记录.emt,这样在模板列表里顺序稳定。
我一般会这样做:把default/当只读备份,自己新建一个custom/,把要改的模板复制进去改,然后db.ini指向custom/。这样升级包的时候,直接替换default/不影响自己的定制。注意,模板文件里如果有引用图片或字体,路径最好用相对路径,别写C:\...的绝对路径,否则换台机器就找不到资源。
3.3 print.ini 与打印预览:纸张、边距和默认打印机
config/print.ini控制打印预览的默认行为。电子病历打印对纸张和边距很敏感,A4 和 A5 混用是常事。这个文件里通常有:
[print] paper_size = A4 margin_left = 20 margin_right = 15 margin_top = 15 margin_bottom = 15 default_printer =逻辑说明:paper_size支持 A4、A5、Letter 等,单位是标准纸张名。margin_*单位是毫米,数值按医院实际打印要求调。default_printer留空表示用系统默认打印机,如果你指定了打印机名,但那台机器上没装这个驱动,打印预览会直接报错。我一般留空,让用户自己在系统里选。
参数怎么改:如果打印出来内容偏左,把margin_left调大;如果分页不对,先检查paper_size和实际纸盒里的纸是否一致。有个坑:有些 portable 包里的print.ini是只读的,你改了保存不了,表现就是每次启动都恢复默认。遇到这种情况,右键文件 → 属性 → 取消只读,再改。
4. 避坑与排查:启动失败、模板乱码、打印偏移的常见问题
4.1 启动闪退,日志里写 “cannot load resource”
现象:双击 exe 后窗口一闪而过,logs/目录里最新日志最后一行是cannot load resource: xxx。 原因:resources/目录被解压软件漏掉了,或者解压时被杀软隔离了部分文件。portable 包里的资源文件(图标、字体、打印配置)经常被误判。 解决:重新解压,解压前先把整个 zip 加入杀软白名单。解压后核对resources/目录大小,如果明显偏小,说明没解压全。
4.2 模板列表是空的,但 templates 目录里明明有文件
现象:程序能启动,但模板下拉框里什么都没有。 原因:db.ini里的template_path指向了一个不存在的目录,或者路径用了反斜杠\而程序只认正斜杠/。 解决:打开db.ini,把template_path改成../templates/custom这种正斜杠相对路径,确认目录真实存在。如果还不行,看日志里有没有scan template dir failed,有的话就是权限问题,把模板目录的只读属性去掉。
4.3 模板里的中文变成方块或乱码
现象:打开模板,中文显示为方块,或者变成????。 原因:模板文件保存时用了 UTF-8 带 BOM,而程序按 GBK 解析;或者系统区域设置里“非 Unicode 程序的语言”不是中文。 解决:用记事本打开模板文件,另存为时编码选 ANSI(GBK),别选 UTF-8。如果是 Windows 10 英文版,去“区域设置 → 管理 → 更改系统区域设置”里改成中文,重启后再试。
4.4 打印预览正常,实际打印偏移或分页错乱
现象:屏幕上预览没问题,打出来内容偏下或者被切掉。 原因:print.ini里的边距是给预览用的,实际打印机驱动还有自己的最小边距,两者叠加就偏了。 解决:先把print.ini里所有边距设成 0,打印测试页,看驱动强制留多少边距,然后在此基础上加需要的值。另外确认paper_size和打印机纸盒里的纸完全一致,A4 和 A5 混用必偏。
4.5 换一台 Windows 10 机器就提示缺少 dll
现象:在 A 机器上跑得好好的,拷到 B 机器上就报缺 dll。 原因:B 机器的系统 VC++ 运行库版本比 A 机器旧,而 portable 包里的runtime/又没有覆盖到所有依赖。 解决:别去单独下 dll,直接把 A 机器上整个emed64目录(包括runtime/)打包拷过去。如果还缺,在 B 机器上装一个最新 VC++ 运行库合集,再启动。
5. 进阶:把 portable 包做成可分发的绿色工具,以及我的验证习惯
5.1 用批处理做启动前自检,减少一半的“打不开”反馈
如果你要把这个包发给别人用,光给一个 zip 是不够的,对方大概率会解压到中文路径然后说打不开。我一般会在根目录放一个启动.bat,内容如下:
@echo off chcp 65001 >nul cd /d %~dp0 REM 检查是否在中文路径下运行 echo %cd% | findstr /r "[^\x00-\x7F]" >nul if %errorlevel%==0 ( echo 当前路径包含中文或特殊字符,建议移动到纯英文路径再运行。 pause exit /b ) REM 检查 runtime 目录是否存在 if not exist "runtime\" ( echo 缺少 runtime 目录,请重新解压完整包。 pause exit /b ) REM 启动主程序并保留错误输出 emed64.exe if %errorlevel% neq 0 ( echo 程序退出,错误码 %errorlevel%,请查看 logs 目录。 pause )逻辑说明:chcp 65001切到 UTF-8 代码页,避免中文提示乱码。cd /d %~dp0把工作目录切到 bat 所在目录,保证相对路径正确。findstr那行用正则匹配非 ASCII 字符,检测路径里有没有中文。if not exist "runtime\"检查关键目录。最后启动 exe,如果退出码非 0,提示看日志。参数含义:%errorlevel%是上一个命令的退出码,非 0 表示异常。这个 bat 不解决所有问题,但能把最常见的两类反馈挡在门外。
5.2 模板批量替换:用 Python 脚本改一批文件的编码和字段
如果你有几十个模板要统一改编码或者替换某个字段,手动一个个开记事本太慢。我一般用一段 Python 脚本处理:
import os import chardet # 模板目录,改成你自己的路径 template_dir = r"D:\tools\emed64\templates\custom" # 要替换的字段,比如把旧版本号改成新版本号 replace_map = { "20.5.0": "20.6.0", "旧字段名": "新字段名" } for filename in os.listdir(template_dir): if not filename.endswith(".emt"): continue filepath = os.path.join(template_dir, filename) # 先探测编码 with open(filepath, "rb") as f: raw = f.read() encoding = chardet.detect(raw)["encoding"] or "gbk" # 按探测到的编码读取 with open(filepath, "r", encoding=encoding, errors="ignore") as f: content = f.read() # 执行替换 for old, new in replace_map.items(): content = content.replace(old, new) # 统一写回 GBK,避免程序解析乱码 with open(filepath, "w", encoding="gbk", errors="ignore") as f: f.write(content) print(f"已处理: {filename}")逻辑说明:chardet.detect先猜原文件编码,避免直接按 GBK 读 UTF-8 文件导致乱码。replace_map里放你要批量替换的键值对,比如版本号或者字段名。最后统一用 GBK 写回,因为大多数 emed64 版本按 GBK 解析模板。参数怎么改:template_dir改成你的模板目录,replace_map按实际需求增删。注意,跑之前先备份一份模板,替换脚本没有后悔药。
5.3 验证 portable 包是否“干净”的两个习惯
第一个习惯:解压后先看logs/目录里有没有上一次运行留下的日志。如果有,说明这个包可能被人跑过,配置里可能残留了别人的 host 和路径。我一般会把logs/清空,config/db.ini恢复成 local 模式再启动。
第二个习惯:用netstat看一眼程序启动后有没有对外发起连接。portable 包理论上不该偷偷连外网,但有些打包者会塞更新检查。命令行里跑:
netstat -ano | findstr "emed64"如果看到 ESTABLISHED 状态连着一个陌生 IP,就去config/里找有没有update.ini之类的文件,把更新地址注释掉。这个习惯帮我省过几次“为什么内网机器一启动就卡”的排查时间。
从那以后我每次拿到 portable 包,都强制走一遍“解压到英文路径 → 清 logs → 改 db.ini 为 local → 命令行启动看输出”这个流程,再决定要不要发给别人。希望帮到你。
本文还有配套的精品资源,点击获取