
EverythingToolbar 安装器拆解Inno Setup 如何优雅处理 COM 注册、依赖检查与卸载【免费下载链接】EverythingToolbarEverything integration for the Windows taskbar.项目地址: https://gitcode.com/gh_mirrors/eve/EverythingToolbarEverythingToolbar 是一款把 Everything 极速文件搜索集成到 Windows 任务栏的开源工具而它的 Inno Setup 安装器只有 5 个脚本文件却把 COM 组件注册、.NET 运行时依赖检查、旧版本迁移和彻底卸载这些脏活处理得干净利落。本文带你逐块拆解 Installer/ 目录下的安装脚本看看这份不到千行的脚本有哪些值得抄的设计。 安装器目录结构一份共享脚本两种架构整个安装器由一个主脚本 两个架构入口构成核心思路是单一事实来源Single Source of Truth文件职责SharedInstaller.iss主脚本文件清单、注册表、安装/卸载逻辑Installer-x64.iss / Installer-arm64.iss架构入口仅 7 行DotNetInstaller.iss.NET 8 运行时依赖检查WixUninstaller.iss旧版 Wix/MSI 安装迁移清理InnoDependencyInstaller/CodeDependencies.iss第三方依赖下载安装库含 LICENSE.md架构入口脚本几乎只做两件事——指定构建目录和输出文件名然后#include共享脚本#define ArchitecturesAllowed x64os #define OutputBaseName EverythingToolbar- MyAppVersion -x64 #include SharedInstaller.iss版本号直接从构建产物EverythingToolbar.Launcher.exe的文件属性中读取GetVersionNumbersString避免了代码改了、版本号忘了改的经典翻车。 双模式安装一个选项页决定装哪些文件EverythingToolbar 有两种集成方式安装器在欢迎页之后插入一个自定义选项页SharedInstaller.iss让用户二选一Launcher推荐 Windows 11把 EverythingToolbar 作为普通任务栏图标固定或在 Win11 任务栏内嵌搜索框Deskband适合 Windows 10以 COM 工具栏形式直接嵌入任务栏。这个选择不是走个过场它通过Check: IsLauncherSelected/Check: IsDeskbandSelected条件真正控制安装行为[Files]段只复制所选模式的文件L36-L39COM 注册表项也只在 Deskband 模式下写入。此外还支持/modelauncher|deskband命令行参数方便 winget 等场景静默指定模式。 COM 注册不跑 regsvr32直接写注册表Deskband 本质是一个 COM 进程内服务器EverythingToolbar.Deskband.comhost.dll。传统做法是安装时调regsvr32注册、卸载时再反注册——项目里的手动脚本 tools/install_deskband.cmd 就是这么干的。但安装器选择了更稳妥的方式在[Registry]段逐条手写 HKCR 注册表项SharedInstaller.issCLSID\{9D39B79C-E03C-4757-B1B6-ECCE843748F3} → EverythingToolbar CLSID\...\InProcServer32 → {app}\EverythingToolbar.Deskband.comhost.dll CLSID\...\InProcServer32\ThreadingModel → Both ProgID → EverythingToolbar.Deskband.Server双向指回 CLSID这样做的好处不依赖 regsvr32 的行为注册内容与安装目录精确绑定{app}自动展开为实际路径每一条都带uninsdeletekey标志卸载时自动干净移除不留 COM 垃圾注册表项的存在本身还能被IsDeskbandInstalledL160-L164用作是否安装过 Deskband的探测器为升级时自动沿用旧模式服务。COM DLL 被 explorer.exe 加载杀不掉也换不掉。安装器在PrepareToInstall阶段执行一套停摆 → 替换 → 复活流程L94-L118先保存并临时关闭 Winlogon 的AutoRestartShell防止 explorer 被系统自动拉活taskkill结束 explorer等 1 秒安装结束再恢复注册表值并重启 explorer。这个防自动重启的细节是桌面工具栏类安装器最容易踩的坑。⚙️ .NET 依赖检查运行时缺失时自动下载EverythingToolbar 基于 .NET 8 Desktop 运行时。安装器在InitializeSetup里调用 DotNetInstaller.iss 的AddDotNet80DesktopDependency先用Dependency_IsNetCoreInstalled(Microsoft.WindowsDesktop.App, 8, 0, 0)检查是否已装 .NET 8 桌面运行时缺失时才把windowsdesktop-runtime-8.0.13加入依赖清单安装参数为/passive /norestart并通过/lcid传入系统语言Dependency_String宏按系统架构自动挑选 x86/x64 下载地址。而 CodeDependencies.iss783 行的第三方库则提供了完整的下载体验独立下载进度页、失败自动重试Abort/Retry/Ignore、校验和验证、装完按需重启。用户全程不需要跳出安装器去官网找运行时。 旧版本迁移21 个 ProductCode 的清理清单项目早期用 Wix/MSI 打包后来迁移到 Inno Setup。为了不让老用户卡在新旧版本冲突WixUninstaller.iss 内置了1.0.0 到 1.5.5 共 21 个 Wix ProductCode 清单逐个探测卸载键HKLM/HKCU 的Uninstall\{ProductCode}命中则弹窗告知需要移除旧版本、完成后系统会重启、重启后重跑安装器卸载前先删除任务栏固定图标固定指向旧安装路径的.lnk会在新版本装到别的路径后失效再执行msiexec /x {ProductCode} /passive /forcerestart静默卸载。升级场景同样被照顾到InitializeSetupL184-L245会读取AppId_is1卸载键中的DisplayVersion——如果装的正是当前版本直接弹窗取消如果是旧版本则自动识别安装类型Launcher 还是 Deskband并跳过选择页无感升级。 优雅卸载杀进程、清注册表、兜底删目录卸载逻辑集中在几个 Inno Setup 钩子函数中层层设防时机动作InitializeUninstalltaskkill结束 Launcher 进程若注册表里还有 Deskband CLSID按停摆流程结束 explorer[UninstallDelete]filesandordirs兜底删除整个{app}目录防止漏网文件[Registry]全部条目带uninsdeletekeyCOM 注册随卸载自动清除[Files]restartreplaceuninsrestartdelete标志配合 Windows 重启替换机制处理被锁定的 DLLDeinitializeUninstall恢复并重启 explorer安装侧的DeinitializeSetup也会重启 explorer保证无论安装成功还是中途取消任务栏都能正常复活。[Run]段则在安装完成后提供一个立即启动的勾选项skipifsilent保证静默安装不受打扰。 权限策略默认最低权限Deskband 才要管理员安装器声明PrivilegesRequiredlowest默认当前用户级安装同时允许用户在界面中选择为所有用户安装PrivilegesRequiredOverridesAlloweddialog来提权。但 Deskband 模式注册的是全局 HKCR 键必须有管理员权限。安装器的处理很人性化非管理员运行时选项页中的 Deskband 选项直接置灰禁用并显示一行红色加粗提示需要使用为所有用户安装才能启用 DeskbandL281-L288如果通过命令行强行指定/modedeskband则弹窗报错并终止提示改用管理员身份或/modelauncher。✅ 总结这份安装脚本值得抄的 6 个设计架构入口只配参数x64/arm64 脚本各 7 行全部逻辑收敛在共享脚本里选项页驱动一切Launcher/Deskband 选择通过Check条件联动文件复制与注册表写入装得少、留得净注册表直写替代 regsvr32COM 注册项与卸载清理一一对应uninsdeletekey注册项还能反查安装状态依赖自检 自动下载.NET 8 运行时缺啥补啥语言、架构全自动匹配迁移清单兜底21 个历史 ProductCode 任务栏快捷方式清理老用户平滑升级到新安装器最小权限 强制点提权默认用户级安装只有真正需要全局注册表的 Deskband 才要求管理员。对普通用户而言这套机制的价值在于装得干净、升级无感、卸载无痕——这正是优雅二字的含义。【免费下载链接】EverythingToolbarEverything integration for the Windows taskbar.项目地址: https://gitcode.com/gh_mirrors/eve/EverythingToolbar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考