恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

EmbeddedWB在Delphi 12.3中的编译安装与实战指南

  • 首页
  • 资讯中心
  • /
  • EmbeddedWB在Delphi 12.3中的编译安装与实战指南

相关资讯

Python实现BP神经网络预测模型:数据预处理与参数调优实战指南 2026/10/10 7:45:24
扣子视频工作流实战:每日读书短视频自动化流水线配置全解 2026/10/10 7:40:24
面向目标跟踪的雷达干扰:从原理到Matlab仿真 2026/10/10 7:40:24

最新资讯

基于WebGIS的淮河水量水质监测系统Java Web源码解析与实战部署
Skills能力单元:从设计到落地的可复用架构实践
JavaEE+MySQL酒店管理系统:从毕设源码到部署答辩全指南
从AST到质量门禁:代码审查工具impeccable的设计与实践
a2conn:Python连接内网数据库的SSH隧道管理利器
ASP经典Web后端实战:智能井盖系统全链路解析

今日推荐

Codex 总用英文回答?从 AGENTS.md 到 config.toml 的中文输出调优指南
OpenClaw 自定义插件开发完整指南(2026最新版):从 TypeScript 到 npm 发布
基于Spark的电影推荐系统全链路实战:从爬虫到Web展示

本周热门

MR25H40CDF + PIC18F65K40:工业记录仪高可靠存储实战
基于STM32的数控恒压恒流电源设计:从硬件到PID调参全解析
LT9211 MIPI重定时器原理与双路扇出实战指南

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

EmbeddedWB在Delphi 12.3中的编译安装与实战指南

发布时间:2026/10/10 7:45:24
EmbeddedWB在Delphi 12.3中的编译安装与实战指南 简介面向Delphi开发者的EmbeddedWB控件完整源代码包覆盖D5至XE12版本基于WebBrowser技术实现嵌入式网页浏览与交互适合需要在桌面应用中内嵌页面、抓取网页数据或自定义浏览器行为的开发场景。压缩包共226个文件大小约2.44MB其中包含65个pas源文件、126个dcu预编译单元、22个dpk工程文件以及res、inc、dfm等辅助资源既能查看原始实现也便于重新编译集成。目前已有87人学习下载。通过分析源码可深入理解控件的事件触发与底层封装逻辑还可利用工程文件快速装入IDE针对下载管理、脚本注入、页面渲染等需求做定制修改是学习和扩展EmbeddedWB功能的实用资料。1. EmbeddedWB-D5-XE12-SRC这个源码包解决什么问题为什么还有人用它看到 EmbeddedWB-D5-XE12-SRC.7z 这个包名第一反应很可能是都 2025 年了还折腾 IE 内核这个判断对了一半。EmbeddedWBEmbedded Web Browser是 Delphi 社区流传很多年的网页浏览器封装控件它把 IE 内核塞进 VCL 窗体让桌面程序里直接嵌一个能跑 HTML/JS/ActiveX 的浏览器窗口。D5-XE12 表示这套源码覆盖从 Delphi 5 到 XE 系列的一大批老版本SRC 就是 Source源码包。它到今天还有价值的原因很简单大量存量系统——工控上位机、医院挂号机、企业内部帮助中心——还在用 TWebBrowser 这层老技术而 EmbeddedWB 恰好把这些项目最头疼的 JS 互调、弹窗拦截、右键菜单屏蔽都封装好了。适合读这篇的人有两类一类是维护老项目、被迫把新 IDE 和旧控件撮合到一起的工程师另一类是刚开始学 Delphi、想找个能快速出界面的浏览器控件的同学。下文直接按判断版本到底能不能用 → 编译安装 → 跑通第一个页面 → 踩坑清单 → 一个能落地的进阶用法来写全程围绕 Delphi 12.3 这个实际环境。2. 装进 Delphi 12.3 之前先看懂 D5-XE12 的版本范围和依赖关系2.1 为什么给 D5-XE12 的源码包能在 12.3 编译源码包和二进制包的根本区别很多人拿到这种包会有一个疑问控件明明写着支持到 XE 系列怎么敢往 Delphi 12.3 里装这就要分清两种分发形式。如果下载到的是编译好的 .bpl、.dcu 文件那基本没戏因为 DCU 内部格式和具体编译器版本强绑定Delphi 12 的 IDE 不会认老版本的编译产物。但标题里明确写了 SRC说明你拿到的是 .pas 源码附带 .dpk 或 .dproj 工程文件。源码包的意义就在于安装时由你当前这台机器上的 Delphi 重新编译一遍生成匹配 12.3 的 DCU 和 BPL。所以只要源码没有使用当前编译器已经移除的语法或单元理论上都能装。打开包先做三件事判断它的底子干不干净。第一用文本检索工具在 .pas 文件里搜CompilerVersion或VER这样的条件编译关键字能看到类似{$IFDEF VER230}之类的分支。有这些宏说明作者长期维护对老版本做过分叉处理装进新 IDE 的成功率高得多。第二打开主单元看 uses 子句如果出现OleServer、ActiveX、MSHTML_TLB、SHDocVw这几个名字说明它走的是公开 COM 接口这类代码在近几代 Delphi 里几乎没有破坏性变更。第三看包内是否带 .inc 头文件很多老控件用 include 文件保存公共编译选项有它至少说明工程结构是规范的。实际检索命令在 Windows 下用 findstr 就行不一定要装额外工具findstr /S /M /C:CompilerVersion C:\Proj\EWB\*.pas这条命令会在指定目录下递归搜索包含 CompilerVersion 字样的文件并把文件路径列出来。参数/S是递归子目录/M只显示包含匹配内容的文件名而不打印整行/C:指定精确字符串避免把Version之类的半截词也搜进来。搜到文件后逐个打开看条件编译块覆盖到哪个版本如果最新只写到 VER230对应 Delphi 10.4说明作者最后一次适配在 XE 时代这不代表 12.3 不能编但要有点心理准备总会有几个编译错误需要手工处理。2.2 隐藏依赖MSXML、SHDocVw、OleServer 与它们和 IE 内核的关系EmbeddedWB 不是简单地把 TWebBrowser 换个皮肤它直接操纵 IWebBrowser2 接口同时用 MSXML 做 DOM 解析。编译这种控件时机器上必须能找到几组对应的 Delphi 单元它们的状态决定了你会不会撞上缺文件错误。把这些依赖摸清楚后面编译时看到报错才不慌。依赖作用在 12.3 下的常见状态报错长什么样SHDocVw封装 IWebBrowser2提供浏览器对象模型Delphi 自带路径默认在库中找不到 SHDocVw_TLBMSXMLmsxmldom 等XML/DOM 解析脚本互调用得上自带但有版本差异路径偶尔没配msxmldom.dcu not foundOleServer服务端控件基类老包常用自带通常没问题找不到 OleServer.dcuActiveXCOM 基础单元自带极少缺不少人在 12.3 里编译 EmbeddedWB 时卡在msxmldom.dcu not found这个错误上第一反应是去装 MSXML SDK。其实这个报错和你系统里有没有 msxml.dll 没有关系它是 Delphi 编译器在自己的库路径里找不到 msxmldom.pas/.dcu 单元文件。常见原因是 Library Path 里漏了 Delphi 自带的 MSXML 相关目录或者包内自带了一份复刻的 MSXML 单元但它所在的目录没有加进全局路径。处理顺序有讲究先找包内有没有 msxmldom.pas如果有把它所在目录加进 Library Path 并优先于系统库如果没有到 Delphi 安装目录下找现成的 .dcu。用 where 命令能快速定位where /r C:\Program Files (x86)\Embarcadero\Studio msxmldom.dcu/r表示从指定目录开始递归搜索不加/r的 where 只查 PATH。找到后把该目录追究到 Library Path 里即可。这里多说一句尽量别把整个 Studio 安装目录加进工程搜索路径搜索范围太大会拖慢 IDE 启动和编译速度只加实际包含缺失 dcu 的最小目录。2.3 包的结构运行时包与设计时包为什么要分开装老 Delphi 控件包通常拆成两个层次运行时包Runtime Package和设计时包Design-time Package。运行时包的作用是让你的程序在启动时能加载这些功能单元它只负责跑设计时包则是给 IDE 用的插件作用是让组件出现在组件面板上双击就能拖进窗体同时生成对应的代码。为什么要分开因为设计时包依赖 IDE 的 DesignIDE 等设计期单元这部分代码如果混进运行时包会让最终用户程序无端多出一堆 IDE 相关的 DLL 依赖。所以工程文件里经常有两个 .dpk/.dproj一个名字朴素、用于 Build一个名字带 D 或 Design 字样、用于 Install。命名规则每个包不一样不能一概而论但经验是打开包工程后看 Project Manager 窗口如果右键菜单里有 Install 这个动作它多半是设计时包如果只有 Build/Compile那就是运行时包。12.3 里 Install 按钮是判断包类型最可靠的信号。安装顺序也是个容易翻车的点必须先编译运行时包再安装设计时包。原因是设计时包会 require 运行时包里的单元运行时包没编译好设计时包一安装就会报找不到某个 dcu或依赖的 BPL 不存在。这一步顺序错了后面所有排查都是白费。先把概念立住下一章直接把完整的安装操作流程走一遍。3. 在 Delphi 12.3 编译安装 EmbeddedWB最小操作流程与验收3.1 解压和目录规划路径短、无中文、避开 UAC拿到 EmbeddedWB-D5-XE12-SRC.7z解压这一步就值得单独说。老控件对文件路径的容忍度比现代组件低得多路径里有中文、空格、超长层级编译时可能冒出莫名其妙的资源找不到错误而且这类错误日志根本不提示是路径问题只能靠猜。建议的解压目录是类似C:\Proj\EWB这样的短路径原因有三个。第一避开C:\Program Files这类受系统保护的目录原因不用多解释UAC 会在编译写 dcu 时拦截你。第二不要带中文老 Pas 源码里有些硬编码的 include 路径在处理非 ASCII 字符时会给编译器添乱。第三整个包解出来后目录层级别太深三层以内最好7z 包本身可能已经带了多层目录结构再往深处放IDE 搜索路径就容易碰到 Windows 路径长度上限。如果你已经把它解压到了类似E:\下载\老项目存档\EmbeddedWB-D5-XE12-SRC这种很长的路径懒得手工搬迁可以用 robocopy 一键复制到短路径robocopy E:\下载\老项目存档\EmbeddedWB-D5-XE12-SRC C:\Proj\EWB /E /COPY:DAT/E会复制所有子目录包括空目录/COPY:DAT只复制数据、属性和时间戳不复制 NTFS 安全权限这样可以避免文件被带上原来机器的 ACL 导致本机读写受限。对比直接用资源管理器复制robocopy 的优势是长路径支持更稳中途失败还能续传。复制完建议顺手打开源码目录看一眼确认 .pas 和 .dpk 都在第一层或第二层别解压出个压缩包套压缩包。3.2 添加 Library PathWin32 与 Win64 各加一遍EmbeddedWB 这类老控件在 12.3 里编译能不能过很大程度取决于 Library Path 配得对不对。Library Path 是编译器搜索单元的全局路径它和工程的 Search Path 不同工程搜索路径只对当前工程生效Library Path 对整个 IDE 的所有工程生效。控件包就是要加进 Library Path因为组件安装后后续任何工程用到它时编译器都要能找到对应单元。具体操作路径在 Delphi 12.3 中是 Tools Options Language Delphi Library Library Path。打开后注意左上角有平台下拉框默认显示的是 32-bit Windows。这里有个容易被忽略的点加完 Win32 路径后要手工切到 64-bit Windows 再加一遍。很多人只加了当前选中的平台结果新建一个 64 位工程时立刻报找不到 EmbeddedWB又回头查半天。推荐加进去的目录是包里放源码的那个文件夹一般叫 Source。如果你把整个包根目录加进去IDE 会去扫描示例工程、资源文件、文档不仅拖慢搜索速度还可能出现单元名冲突——示例里同名 pas 覆盖了正经源码这种问题排查起来非常费时间。加完之后可以不关闭设置窗口直接切到 Use 界面的其他平台确认两处都已写入。判断路径是否生效有个简单方法随便新建一个空 VCL 工程在代码里敲一个 EmbeddedWB 单元里特有的类名如果自动补全能弹出来说明搜索路径已经接上了。这个方法比看设置界面更直观我每次配置完都会这么验一下。3.3 编译运行时包并安装设计时包右键菜单的正确用法路径配好接下来就是正式的编译安装。先在项目管理器里把包工程加载进来。操作路径是 File Open Project然后在文件对话框里把文件类型筛选改为 Delphi Package.dpk.dproj找到你判断为运行时包的那个文件打开。打开后项目树上会出现这个包右键可以看到 Compile 和 Build 两个动作快捷键分别是 CtrlF9 和 ShiftF9。这里用 Build 更稳妥理由是 Build 会重新编译所有依赖单元而 Compile 会尝试增量编译老包换到新 IDE 后增量编译经常误判认为某些旧 DCU 还能用导致链接出一堆牛头不对马嘴的错误。Build 通过后再 File Open Project 打开设计时包此时右键菜单里会多出一个 Install 动作。点击 Install弹出的对话框里能看到这个 BPL 被注册进 IDE 的包列表。如果这里弹出无法加载包或不是有效的 Delphi 包之类的错误多半是前一步运行时包没 build 好或者你拿错了文件——拿运行时包来 Install 就是这个结果。安装成功后组件面板会多出一个页签常见叫 EmbeddedWB 或相关名字里面躺着 EmbeddedWB 这个主控件。这一整步没有捷径有些人为了省事直接把两个包都打开一起右键 Build 再一起 Install如果两个包之间存在依赖关系这种操作顺序经常失败。老老实实先装运行时包、再装设计时包一般一遍过。在这个环节还经常遇到缺某个单元路径的报错别急着去翻包先回 3.2 把报错单元所在的目录补进 Library Path再重新 Build。3.4 新建工程验收拖入组件并跑通第一个 Navigate装完之后别急着开心做一个最小验收工程确认组件真的能编译进用户程序。新建一个 VCL Application平台选 32 位 Windows往窗体上拖一个 EmbeddedWB 组件再放一个按钮和一个 Edit。在按钮 OnClick 里写一行导航代码procedure TForm1.Button1Click(Sender: TObject); begin EmbeddedWB1.Silent : True; EmbeddedWB1.Navigate(Edit1.Text); end;Silent : True的作用是屏蔽 IE 内核的脚本错误弹窗。老网页里经常有一些无关紧要的 JS 报错不屏蔽的话每加载一页都可能蹦一个在此页上的脚本造成 Internet Explorer 运行速度减慢之类的对话框非常干扰体验。Navigate是异步操作传入字符串是目标 URL可以是https://或file:///开头的地址执行后立即返回真实加载完成发生在后台。运行程序在 Edit 里输入一个本地 HTML 文件的 file:// 地址点按钮窗体里应该出现页面内容。如果出现空白页大概率不是控件问题而是 IE 渲染模式过旧这个坑放第五章细说。如果出现的是类未注册或对象名未找到那说明安装的包有问题或者 Library Path 和实际安装路径不一致。最小验收能过说明 EmbeddedWB 已经正式在 Delphi 12.3 里活下来了可以进入实际业务开发。4. 让 EmbeddedWB 真正干活导航时机、JS 互调与弹窗拦截4.1 DocumentComplete判断页面真正加载完成的三个信号EmbeddedWB 的导航是异步的Navigate刚返回时页面可能还没有任何内容马上访问 DOM 或执行脚本大概率扑空。判断页面加载完成的可靠信号有三个Busy 属性变成 False、触发 DocumentComplete 事件、以及执行某条 JS 能拿到预期结果。其中 DocumentComplete 是最常用的但很多人直接在事件里无脑写逻辑遇到页面里有 iframe 就翻车。iframe 加载完成也会触发 DocumentComplete事件参数里带回来的 pDisp 是当前触发者的接口和顶层窗口的 pDisp 不是同一个值。正确写法是用 Application 属性判断这次完成事件是不是顶层页面发出来的procedure TForm1.EmbeddedWB1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant); begin if pDisp EmbeddedWB1.Application then StatusBar1.Panels[0].Text : 页面完成: EmbeddedWB1.LocationURL; end;pDisp是这次完成事件对应的浏览器对象Application是控件持有的顶层浏览器对象两者相等才说明整个页面加载完了。LocationURL比事件参数里的 URL 更可靠因为重定向之后参数 URL 可能是初始地址而 LocationURL 是最终地址。在这一步不要急着做复杂的页面解析先确认 URL 是自己期望的再后续操作。4.2 Delphi 调用页面 JavaScriptExecScript 是最稳的入口Delphi 侧往页面里注入脚本最常用的方法是调用 ExecScript。这个方法是 EmbeddedWB 封装好的可以直接把一段 JavaScript 代码作为字符串丢给页面执行免去手工拿 IHTMLDocument2 接口再操作窗口对象的麻烦。if EmbeddedWB1.ExecScript( document.getElementById(saveBtn).click();, JavaScript) then Label1.Caption : 脚本已注入 else Label1.Caption : 脚本注入失败;ExecScript 返回 Boolean表示脚本有没有成功送进页面执行环境但它不能告诉你脚本内部有没有抛异常。比如脚本里引用了不存在的对象返回仍然是 True执行却以失败告终。所以关键逻辑最好在脚本层面自己包一层容错或者通过 Delphi 回调接收结果。第二个参数是脚本语言老版本常见写法是JavaScript有的包也接受JScript安装后先用最简单的alert(test)试一下哪个字符串被接受。测试时建议直接把 alert 屏蔽关掉否则会被弹窗淹没。脚本字符串里的中文和特殊字符要注意ExecScript 传入的是 Pascal 字符串脚本里的内容要符合 JS 语法。如果数据里有单引号直接拼接会把整个脚本弄崩。常见的做法是先将数据进行转义再拼脚本字符串内容里的\和都要转反斜杠换成\\单引号换成\。function JSStringQuote(const AValue: string): string; begin Result : StringReplace(AValue, \, \\, [rfReplaceAll]); Result : StringReplace(Result, , \, [rfReplaceAll]); end;StringReplace的最后一个参数[rfReplaceAll]是必须的不带它默认只替换第一处遇到多条记录时脚本就会错乱。把用户输入、数据库字段这类动态数据拼进 JS 之前过一遍这个函数能省掉大量玄学报错。4.3 页面里的 JS 反向呼叫 Delphi最老但最灵的协议拦截方案业务场景里经常有页面想通知 Delphi 侧做点事比如点网页上的按钮触发本地打印、从页面把表单数据交回桌面程序。实现途径有好几条最稳的其实是 IE 时代流传下来的伪协议拦截思路。原理简单页面里把location.href赋一个自定义协议地址比如myapp://action?nameabcEnbeddedWB 在导航开始前会触发 BeforeNavigate2 事件Delphi 侧在这里截住这个地址解析参数后自己处理同时把本次导航 Cancel 掉不让 IE 真的去打开这个未知协议。procedure TForm1.EmbeddedWB1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; const URL: WideString; const Flags: OleVariant; const TargetFrameName: OleVariant; const PostData: OleVariant; const Headers: OleVariant; var Cancel: WordBool); var AAction: string; begin if Pos(myapp://action?, LowerCase(URL)) 1 then begin AAction : Copy(URL, Pos(?, URL) 1, MaxInt); DoMyAction(AAction); Cancel : True; end; end;Pos返回第一次出现子串的位置用LowerCase(URL)是为了让页面里写MyApp://还是myapp://都能命中。Copy(URL, Pos(?, URL) 1, MaxInt)取出问号后面所有内容这里的 MaxInt 表示取到字符串末尾。Cancel : True是本方案的核心忘记写它会触发系统弹窗提示没有关联程序来执行这个操作。这个方案的优点是跨版本最稳定不依赖任何 COM 注册。缺点也明显URL 长度有限制不适合传大段数据传结构化内容时建议用 Base64 编码塞进参数或者拆成多条消息按顺序传。4.4 弹窗、右键与脚本错误进场先关掉三样东西用 IE 内核的控件做桌面程序弹窗管理是最影响体验的部分。网页里的 alert、confirm 会以 IE 对话框的样式弹出来和桌面程序风格完全不搭右键菜单是浏览器默认的查看源代码、刷新那一套和业务无关脚本错误弹窗会在每个页面加载时报错。这三样东西进场第一件事就要处理。alert 和 confirm 的拦截方式是找 EmbeddedWB 事件列表里 ShowMessage 相关的动作。每个版本的事件命名略有差异但大致逻辑一致设一个 Handled 标志为 True表示这个弹窗由 Delphi 自己处理然后根据业务弹一个 MessageDlg。需要注意的是 confirm 有返回值不像 alert 只需要关闭所以在确认框的场景里要把 MessageDlg 的返回值转成确认标志再赋回去不同版本的包返回值位置不一样以事件参数说明为准。右键菜单的关闭通常是属性开关到对象检查器里搜 Menu 或 Popup 相关的属性把浏览器默认菜单相关的项置 False。这个开关在不同版本里位置很分散不需要死记直接把对象检查器的搜索框里敲Menu过一遍把看起来像浏览器专属菜单的选项都关掉就行。脚本错误弹窗则交给 Silent 属性统一处理设成 True 之后大部分脚本错误不会再打扰用户。但注意 Silent 也会连 with 一些有意义的错误信息一起吞掉调试阶段建议先保持 False上线前再开。5. 避坑清单老包装进新 IDE 的 5 个高频故障5.1 msxmldom.dcu not found先查 Library Path再查包内依赖现象编译 EmbeddedWB 包时编译器在早期阶段就报msxmldom.dcu not found整个工程停在这个错误上。初次接触的人会以为是系统缺 MSXML 组件去下载安装包重装系统组件结果问题依旧。原因这个错误的本质是编译器在搜索路径里找不到 msxmldom.pas/.dcu 单元文件。Delphi 自带 MSXML 相关单元但不同版本里存放它的目录有差异未必默认加在 Library Path 中。另外有些 EmbeddedWB 源码包会内置一份修改过的 msxmldom 单元如果包内这份文件没有被搜索路径覆盖到就会报错。解决先用 where 命令在 Delphi 安装目录里定位已有的 msxmldom.dcu把所在目录加进 Library Path。如果包内自带 msxmldom 相关 pas 文件优先使用包内的并把它的目录放到路径列表前端避免和系统库版本冲突。改完路径后重启 IDE 再编译路径配置缓存有时候不会热加载。5.2 BPL 安装后 IDE 提示不是有效的包八成拿运行时包当了设计时包现象在 Project Manager 里打开某个 .dpk右键 Install弹出错误不是有效的 Delphi 包或无法加载包组件面板上什么都没多出来。原因Windows 上的 .bpl 本质是个 DLL运行时包和设计时包虽然喝着同一个项目名但内容不同设计时包额外引用了 IDE 的 DesignIDE 等设计期单元。运行时装包试图 Install 进 IDEIDE 加载它时发现没有设计期注册代码直接拒绝。解决确认你打开的是设计时包。常见做法是把包内所有 .dproj 都看一遍文件名带 D 或 Design 字样的优先。更可靠的判断方法是打开包工程后直接看右键菜单里有没有 Install没有的就不是。如果包内只有运行时包而没有设计时包那就只能用运行时包 代码里手动创建组件的方式使用组件不会出现在面板上。5.3 网页白屏或此页面已停止工作渲染引擎版本过旧现象EmbeddedWB 安装成功能编译能运行但 Navigate 一个现代网站时窗体白屏或者显示此内容在此版本中不可用更有甚者直接弹Internet Explorer 已停止工作。原因IE 内核的渲染模式默认可能停留在旧版本IE7 兼容模式对现代 CSS、ES6 语法支持不够页面整个渲染失败。EmbeddedWB 本身不控制渲染模式它用的是系统 IE 的设置必须通过注册表给程序指定浏览器版本。解决在 HKCU 的 FeatureControl 键下为你的主程序 exe 名称创建 REG_DWORD 值设置 IE 版本。常用值是 11001对应 IE11 Edge 模式。reg add HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION /v MyApp.exe /t REG_DWORD /d 11001 /f/v后面的 MyApp.exe 必须是程序的实际文件名包括扩展名写成别的名字不生效。/d 11001是数据11001 表示 IE11 Edge 模式11000 是 IE11 标准模式平时用 11001 兼容性最好。需要注意 32 位和 64 位程序的注册表视图问题32 位程序写注册表时会被重定向到 WOW6432Node 节点64 位程序则写原生的位置不放心就把两个位置都写一遍。改完注册表要重启程序运行时改不会热生效。5.4 中文 URL 与页面乱码Unicode 交接的旧账现象Navigate 一个带中文参数的 URL比如https://example.com/查询?key中文页面能加载但中文参数变成问号或者页面本身显示正常但通过 ExecScript 传中文进去页面里拿到的是乱码。原因从 Delphi 2009 开始默认字符串类型是 UnicodeString但老控件内部很多地方仍然按 Ansi 处理特别是 URL 拼接和脚本注入这两条路径。Delphi 侧传过去的 Unicode 字符串被隐式转成 Ansi 时代码页对不上中文字符直接变成 。这个问题在高版本 Delphi 上特别典型属于老控件最常见的隐性翻车点。解决给 URL 参数做显式编码把中文转成百分号编码再拼进 URL这是跨版本最安全的做法。编码函数用 System.NetEncoding 里的 TNetEncoding.URL把整段中文参数编码后再拼接。脚本注入则统一走上一章写的 JSStringQuote先转义再拼接。另外页面本身建议用 UTF-8 编码并写明 meta charset避免页面内容解码和二重编码叠加出乱码。这几个点同时处理中文问题基本能压下来。5.5 新版网页打不开认清边界把外部页面甩给系统浏览器现象内嵌网页加载公司 OAuth 登录页能出来但 Google、新版视频网站这类强依赖现代浏览器特性的页面要么白屏要么报错改造 JS 也救不回来。原因IE 内核在 2022 年之后被微软彻底停止支持现代网页不会为 IE 做兼容你的 EmbeddedWB 再调高仿真版本也解决不了 WebGL、Service Worker 这些能力缺失。解决这类问题不该从控件层面解决而要从架构上划清边界。EmbeddedWB 只渲染系统内部页面凡是面向公网或第三方服务的 URL检测到就交给系统浏览器。落地代码也不复杂ShellExecute 一行uses Winapi.ShellAPI; procedure TForm1.OpenExternal(URL: string); begin ShellExecute(0, open, PChar(URL), nil, nil, SW_SHOW); end;ShellExecute的第一个参数 0 表示不依赖父窗口open动作会调用系统默认浏览器打开SW_SHOW让新窗口正常显示。在 BeforeNavigate2 里判断域名如果命中外部分流名单Cancel : True 并调 OpenExternal就不会出现内嵌页面打不开用户又不知道怎么复制链接的尴尬。这套做法不是妥协而是让 IE 内核干它擅长的事把现代网页交给现代浏览器。6. 进阶用 EmbeddedWB 做Delphi 播放 PPT的三种落地方案6.1 为什么这个老需求特别适合 EmbeddedWB很多工控和办公系统里有个经典需求在程序里播放培训 PPT。老的实现方式是让 IE 内核调用本机 Office 的 ActiveX 插件把 PPT 直接嵌进浏览器控件这也是 EmbeddedWB 这类控件在当年被大量选型的原因。但新版 Office 和 Windows 已经移除了 IE ActiveX 支持直接打开 .ppt 文件这条路基本断了。如果项目必须保留内嵌播放体验有三种替代路径按可靠程度排序PPT 转图片、转 PDF 或转长图。转图片最稳不依赖任何插件只要页面能显示转 PDF 需要客户端装了 PDF 控件用 Office Online 嵌入则必须联网。建议优先走转图片方案。6.2 图片版 PPT 翻页页面的最小模板假设你已经把 PPT 导出成了 slide1.png 到 slide12.png放到程序目录下的 slides 文件夹用下面这个 HTML 做一个翻页页面!DOCTYPE html html head meta charsetutf-8 style body { margin:0; background:#333; } #slide { width:100vw; height:100vh; object-fit:contain; } /style /head body img idslide srcslides/slide1.png altPPT 第 1 页 script var n 1, total 12; function go(step) { n step; if (n 1) n 1; if (n total) n total; document.getElementById(slide).src slides/slide n .png; } document.onkeydown function(e) { if (e.key ArrowRight || e.key ) go(1); if (e.key ArrowLeft) go(-1); }; /script /body /htmlHTML 里object-fit:contain让图片在窗口缩放时保持完整比例不裁边。JS 里go(step)是翻页函数step 为正数表示下一页负数表示上一页。页面里绑定了键盘事件屏幕右侧方向键和空格键都能触发。把这个 HTML 文件路径交给 EmbeddedWB 导航窗体里就能获得一个稳定的翻页 PPT 播放器。往后要加幻灯片编号、显示当前页数在 HTML 里补充 DOM 操作就行完全不用动 Delphi 代码。6.3 最后验证三步加载、执行 JS、拿回结果控件安装完、示例跑通后养成固定验证三步的习惯。第一步验证页面加载Navigate 一个本地 HTML等 DocumentComplete 触发看 LocationURL 是否正确。第二步验证注入ExecScript 一段修改页面标题的脚本比如document.title OK再读页面标题确认值被改掉了。第三步验证回调用伪协议方式让页面触达 Delphi 事件确认 BeforeNavigate2 拦截到了自定义 URL。三步全通说明这个包的导航链路、注入链路和回调链路都活着可以放心投入业务。这套验证方法同样适用于以后升级 IDE 或换个老控件包时做回归测试。我现在的习惯是不管什么老控件装进新 IDE先编一遍、再跑这三个最小用例全过才继续往项目里接免得在业务代码里排查控件兼容性浪费的时间远超现在这几分钟。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号