
春节大扫除我在书柜最底层翻出一个用胶带封了很多层的纸箱。打开一看最上面是那本被我翻了无数遍的《Visual Basic 6.0 中文版实用编程技巧》封面的塑料膜已经脱落书脊裂开一道口子露出里面泛黄的内页。压在书下面的是一个防静电袋里面裹着一枚 Pentium III 的 CPU陶瓷封装、针脚完整散热硅脂的痕迹还在。那一刻我对着一块20年前的 CPU 和一堆 VB6 书籍愣了很久——这东西居然还在。这篇内容不是纯怀旧而是想借这些老物件把 VB6 和那个年代 CPU 的事认真聊一遍它为什么在当时能一统快速开发市场老硬件是怎么把这类程序跑得飞起的以及在 2025 年的操作系统上这些东西还能不能用、怎么用。如果你也学过 VB6、拆过老机器或者家里还躺着一些企业旧系统是用 VB6 写的这篇文章应该能让你有些共鸣也能帮你省下不少折腾时间。1. 翻出旧物的那一刻20年前的VB6书籍与老CPU实况1.1 书籍那些被翻烂的VB6教材纸箱里的书不算多但每本都很有分量。除了那本《实用编程技巧》还有《Visual Basic 6.0 中文版程序员指南》《Visual Basic 6.0 数据库开发实例导航》最底下压着一本《Windows API 在 VB 中的应用》。这些书的共同点是书页明显发黄纸张边缘有点发脆内页里夹着各种纸条有的纸条上还写着当年的学习日期。翻到《程序员指南》里讲 ActiveX 控件那一章时我看到自己在页边用圆珠笔写了一行字这个可以在登录框里用旁边画了个箭头指向当时的示例代码。现在看起来有些幼稚但那正是 VB6 时代的真实学习状态——没有半小时起步的视频教程没有铺天盖地的在线文档靠的就是一手翻书、一手敲代码。很多老一辈开发者对 VB6 的感情就是从这种书电脑好奇心的模式里长出来的。VB6 的语法足够简单术语也不绕一个零基础的人只要认识英文单词、肯背几个常用控件的属性当天就能写出一个有输入框、有按钮、能弹窗的程序。这种即时反馈对学习者的激励在今天的教学工具里反而很少找到了。1.2 CPU那些陶瓷封装的老朋友纸箱里那枚 CPU 的具体型号是 Intel Pentium III CoppermineSocket 370 接口主频 800MHz外频 100MHz二级缓存 256KB。它是 2000 年前后装机市场最常见的型号之一配套主板是 i815EP 芯片组内存 128MB 的 SDRAM硬盘是 20GB 的希捷。我把它拿到手里仔细看了看陶瓷背面的字迹虽然有些磨损但Pentium III和频率标识依然清晰。针脚整整齐齐只有几个针脚颜色略深那是当年装散热器时涂硅脂留下的痕迹。这块 CPU 在我手里服役了差不多四年从 Windows 98 一路用到 Windows XP期间刷过很多次 BIOS、超频失败过两次但整体还算皮实。我还从箱子里翻出一块更老的 AMD K6-2 450MHz那是别人送的。Socket 7 平台Super 7 主板当时拿它来跑 VB6 做的数据库小系统也能凑合。K6-2 的浮点性能虽然比同期的奔腾弱但胜在便宜很多学校机房和学生组装机用的都是它。我把这堆东西摆在桌上特意拍了张照片。照片里还有一块 SiS 6326 显卡和一条 64MB 的 SDRAM 内存条——所有部件摆在一起基本就是 2000 年代初一台入门级家用电脑的全貌。1.3 时代坐标千禧年初的电脑学习环境那个年代的学习环境和现在完全是两个世界。没有宽带或者说大部分家庭还在用 56K Modem 拨号上网下载一个几兆字节的安装包可能得挂一夜。买软件靠的是电脑城里的光盘一张盗版合集光盘里塞着几十个软件其中必有 VB6、VC6.0、Delphi 5 这些开发工具。学习资料的来源也有限一种是书店里按斤卖的大部头教材另一种是《电脑报》《电脑爱好者》这类报纸杂志上连载的编程专栏。我记得《电脑报》上有一个长期栏目叫Visual Basic 快乐编程每期讲一个控件或者一个小技巧比如怎么让窗体渐变色、怎么用 Timer 控件做动画。书和杂志上介绍过的技巧我基本都抄在一个笔记本上笔记本里全是手绘的窗体布局图和代码片段。这就是 VB6 能普及的时代土壤它不需要你懂指针、不需要你管内存分配、不需要你理解编译链接一堆底层过程打开 IDE、从工具箱拖几个控件、双击写事件代码一个程序就跑起来了。对一个刚接触电脑不久的人来说这种所见即所得立刻运行的体验简直是魔法。也正是这个原因VB6 成了很多人的第一门编程语言也为后来的软件开发行业输送了大量基础人才。2. 为什么VB6能统治那个时代核心设计逻辑拆解2.1 事件驱动与RAD把写程序变成搭积木VB6 的核心设计理念用今天的话说就是 RAD(Rapid Application Development快速应用开发)。它把界面设计和业务逻辑拆分得非常彻底你先把窗体和控件拖出来摆好位置然后双击某个控件IDE 会自动跳转到该控件对应的事件过程里。这个模型叫作事件驱动。程序不再是简单地从头跑到尾而是永远在等待用户的动作点击按钮、输入文字、移动鼠标、关闭窗口每发生一个动作对应的事件过程就会执行。这种思维方式和当时 C 语言里常用的消息循环回调函数殊途同归但 VB6 用极其直观的方式把它封装好了。我用一个最简单的例子说明Private Sub Command1_Click() Label1.Caption 你点击了按钮 End Sub你不需要关心 Windows 底层怎么把鼠标点击的信息转发给窗口不需要注册窗口类、写消息映射表。只需要双击按钮就会自动生成 Command1_Click 这个事件过程的空壳在其中写上行代码程序就有了交互能力。这种搭积木式的开发方式在 2000 年代初对中小企业和个人开发者来说是巨大的生产力提升。用 C 或 Delphi 写同样的界面需要多花不少时间在框架理解上在 VB6 里一个简单进销存系统的界面熟练的人半天就能拖完。2.2 ActiveX控件生态一块代码积木仓库VB6 时代最有生态价值的东西就是 ActiveX 控件文件后缀 .ocx。这玩意儿是微软留的一手好棋任何第三方厂商都可以用 VB6、VC 或者其他语言编写一个控件封装好功能发布出去其他开发者拿来就往窗体上一拖通过设置属性和调用方法就能使用。我当年最常用的几个第三方控件至今记忆犹新MSFlexGrid 用来做网格数据展示CommonDialog 用来调出打开/保存文件对话框Winsock 控件用来做 TCP/UDP 网络通信还有其他厂商提供的图表控件、串口通信控件、报表打印控件。几乎你能想到的功能都能在 VB6 的世界里找到对应的现成零件。这个思路其实非常超前。今天的开发者在 JavaScript 世界里用 npm 装包、在 Python 世界里用 pip 装库、在 .NET 里用 NuGet本质上和当年在 VB6 里往工具箱里添加一个 OCX 控件是同一个套路复用别人做好的模块把精力集中在自己的业务逻辑上。只不过当年没有中心化的包管理器全靠光盘和网站分发更新迭代也远没有现在快。2.3 IDE与即时调试回不去的轻量体验VB6 的集成开发环境IDE在今天看来简陋但体验在设计思路上有很多值得称道的地方。它有几个运行模式设计状态、运行状态、中断状态。你在代码里打断点然后直接按 F5 运行程序跑到断点处就会停下来进入中断状态可以逐语句F8执行、把鼠标悬停在变量上看当前值、在立即窗口里输入表达式直接计算。这套编辑-运行-调试的循环非常流畅对于小规模程序的迭代开发极其受用。VB6 编译出来的程序分两种模式一种是解释型的 P-Code伪代码另一种是编译成原生机器码的 Native Code。Native Code 模式在当年也很常见程序启动快、无需运行库解释但依赖 MSVBVM60.DLL 这个运行库。在目标机器上装一次 VB6 运行库程序就可以拿着 .exe 直接分发安装包常常只有几百KB到几MB。对比现在一个简单的 Electron 桌面应用动辄一百多兆真是两个时代。那个年代也有苦恼VB6 没有真正的多线程支持、没有面向对象的继承机制只有接口实现和类模块、错误处理主要靠 On Error GoTo、大字符串处理性能堪忧。但这些限制并没有妨碍 VB6 在业务应用、MIS 系统、工业控制上位机、教学演示等领域大放异彩。它用 80% 的简单换取 20% 的边界限制而对大多数开发任务来说那 80% 已经够了。3. 老CPU、老硬件与VB6程序的真实搭配3.1 那年头的CPU天梯聊到老硬件就得先建立一个坐标2000 年前后的 CPU 市场。彼时 Intel 和 AMD 打得正激烈产品线不像今天这么复杂每一档定位都非常清楚。我用一张表还原一下当时桌面 CPU 的主流格局CPU 型号架构/接口主频范围二级缓存市场定位Intel Pentium III CoppermineSocket 370500MHz~1.13GHz256KB中高端主流Intel Celeron (Coppermine核心)Socket 370533MHz~1.1GHz128KB低端普及Intel Pentium 4 (Willamette)Socket 4231.3GHz~2.0GHz256KB高端新贵AMD Athlon (K7)Slot A / Socket A500MHz~1.4GHz512KB高性能/性价比AMD DuronSocket A600MHz~1.3GHz64KB低端走量AMD K6-2Super 7300MHz~550MHz64KB(板载)/ 512KB(可扩展)入门过渡这张表放到今天看最直观的感受是频率低得可怜。我的第一台电脑用的就是赛扬 667MHz配了 128MB 内存装的是 Windows 98 SE。当时跑 VB6 学习版打开 IDE 的时间可能需要十几秒编译一个小程序也是秒过。但在运行编译好的程序时响应非常快一个简单的数据库录入界面基本上是点哪开哪没有现在很多软件那种转圈等待的延迟。这里有一个容易被忽视的点那个年代的 CPU 虽然主频低但软件的体量也小。一个 VB6 写的信息管理系统编译出来通常也就几百KB到几MB内存占用常常只有十几兆。CPU 单核跑单个进程流畅度反而比现在一个大型 IDE 占着几个G内存、多个进程抢调度的体验要舒服得多。3.2 VB6在低配硬件上的性能画像为了验证VB6 程序在老硬件上的表现我特意没有用现在的高配电脑跑虚拟机而是在一块闲置的 VIA C3 533MHz 主板上装了个简化版 Windows 98又用 VB6 写了一个带数据库查询功能的小程序做测试。这个平台比我当年的赛扬还弱一些但结果依旧很说明问题程序启动时间从双击 .exe 到主界面完全显示约 0.5 秒。界面操作响应按钮点击、文本框输入、下拉框选择全部即时响应几乎感觉不到明显停顿。数据库查询使用 Access 数据库Jet 引擎在一张 5 万条的记录表里做模糊查询耗时约 0.1~0.2 秒。内存占用整个程序运行时约占用 8~12MB 内存。这个成绩别说在 2000 年就算放在今天如果某个桌面办公工具能做到这么轻盈也绝对是一个值得吹嘘的亮点。原因也很简单VB6 生成的代码直接跑在 Win32 API 之上没有中间层虚拟机的实时解释成本Native Code 模式控件渲染也走的是老式 GDI 路径整体开销极低。而操作系统本身在那个年代也比较薄Windows 98 开机后内存占用才几十兆给应用程序留的余地自然就大了。这也解释了为什么很多老企业至今还在用 VB6 写的系统功能稳定、部署简单、对硬件要求低。一台三四百元的二手小主机跑跑这些老系统依然游刃有余。3.3 单总线CPU与MIPS单周期大学生都绕不开的CPU设计实验讲 CPU 记忆就绕不开计算机组成原理课程里的经典实验。我看热搜词里有大量单总线CPU设计MIPS单周期CPU设计单总线微程序控制器之类的词这些都是计算机专业学生熟悉的名词。我当时大二做单总线 CPU 设计实验时用的工具是 Logisim在软件里搭数据通路、控制器、寄存器堆、ALU最后跑通一条指令之后心里那股原来 CPU 内部真的是这么运作的的感觉至今记得。这类实验有一个共同点它强迫你从晶体管和信号的角度理解 CPU而不是把它当成一个黑盒。比如单总线 CPU 设计的核心思路是所有部件共享一条数据总线通过控制信号决定某一时刻谁把数据放到总线上、谁从总线上取数据。为了在同一个时钟周期内不冲突每一步都需要严格设计控制信号的时序。这种细节理解对后来做嵌入式、做上位机、写驱动都很有帮助——当你在 C 语言里操作寄存器、设置 GPIO 方向时脑子里就有一个清晰的硬件模型。也是因为这个实验我后来看到热搜词里存储器与cpu的连接单总线cpu微程序条件判别测试逻辑才会觉得特别亲切。老 CPU 不只是被我们踩过、超频过的物理实体还是计算机组成原理课上被我们反复模拟和分析的逻辑实体。3.4 现代CPU跑VB6兼容但不再从容现在如果你手头还有 VB6 写的老程序拿到 2025 年的电脑上运行你会发现一个很有趣的现象程序依然能跑但不再从容。首先是启动速度现代 CPU 主频动辄 4GHz 以上、内存 16GB 起步VB6 程序的启动几乎是一瞬间的事甚至快到感觉不到延迟。但随之而来的是兼容性层面的种种小毛病高 DPI 缩放下窗体控件会模糊、界面字体发虚某些依赖老 API 的控件在 Windows 10/11 上行为异常如果程序用到了 VB6 的报表打印功能打印预览可能没有以前顺滑。更典型的问题出现在系统服务层面。很多老系统跑在 Windows 10 上时用户会发现某个后台进程如服务主机 DCOM或COM 代理占用 CPU 很高。这不一定是你那个 VB6 程序的锅更可能是老控件与新的系统服务框架之间产生了异常交互。这类问题在热搜词里占了不少比如服务主机dcom占用cpu高怎么解决comsurrogate占用cpu过高。遇到这种情况我一般建议先锁定具体是哪个 COM 对象在反复崩溃重启再考虑给控件打补丁或在兼容模式下运行程序。千万不要一上来就怪代码那是当年写程序的人被冤枉最多的手段。4. 二十年后再碰VB6兼容性折腾与经典技巧重现4.1 在Windows 10/11上装回VB6的完整过程如果你和我一样心血来潮想在新电脑上装一个 VB6 IDE 重温一下提前说一句能装但需要一点耐心。我的实测环境是 Windows 11 专业版 23H2虚拟机里也装了一次两者过程差不多。安装步骤我整理成了清单找到 VB6 中文企业版的安装光盘镜像。注意不要用精简版或绿色版安装过程会遇到很多文件缺失和注册表问题。运行 Setup.exe如果 Windows 提示兼容性问题选择以兼容模式运行并设置为 Windows XP (Service Pack 3)。在安装界面选择自定义安装把你要用的组件全部勾上包括数据访问、ActiveX 控件、工具等。安装过程会提示不支持的组件直接忽略继续装。安装完成后立刻安装 Visual Studio 6.0 Service Pack 6SP6补丁。这个补丁解决了大量 Windows XP/2000 之后的兼容性问题。安装 MSDN Library 帮助文档如果手头有的话。没有也不影响基本开发但有些控件帮助会找不到。找到 VB6.exe右键属性 - 兼容性勾选以兼容模式运行这个程序Windows XP (Service Pack 3)并勾选以管理员身份运行此程序。打开 IDE 后如果菜单栏或工具栏出现乱码或布局异常关闭 IDE在命令行里运行一次regsvr32 vb6ide.dll注册 IDE 组件再重新打开。按照这套流程走下来VB6 IDE 基本能正常使用。唯一要适应的是高 DPI 缩放下界面有点糊我建议把 IDE 的兼容性设置里勾选替代高 DPI 缩放行为并选择系统(增强)字体和窗口布局会清晰很多。4.2 经典代码重现打印预览、运行时建窗体、模拟按键装好环境之后我把当年几个高频技巧重新验证了一遍这些正是热搜词里频繁出现的内容。打印预览VB6 里做打印预览老司机一般会绕开直接用 Printer 对象因为它只能直接打印不能预览。常用方案有三种一是用 DataReport 设计报表它有内置的预览窗口二是用第三方报表控件比如水晶报表Crystal Reports三是自己做一个预览窗体把 Printer 输出的内容同时画到窗体的 PictureBox 上模拟预览效果。对于简单的业务单据我当年最常用的是 DataReportDim rpt As New DataReport1 rpt.Show就这么两行配上报表设计器里拖好的字段打印预览界面就出来了。在 2000 年代初这可太方便了。运行时用代码创建新的窗体这是很多新手会卡住的地方。VB6 里窗体分两种默认创建的和需要手动创建的。如果你用Form1.Show而 Form1 还没被加载过VB6 会自动创建它如果你想在运行时动态生成多个相同的窗体实例就要用New关键字Dim frmNew As Form1 Set frmNew New Form1 frmNew.Caption 第 n 个窗体 frmNew.Show用这种方式你可以维护一个窗体集合实现多文档界面、多窗口监控等功能。注意用完要Unload frmNew并Set frmNew Nothing避免内存泄漏。热门词里vb6运行时用代码创建新的窗体指的就是这个New Form Show的用法。模拟按键事件很多自动化和辅助工具需要模拟键盘输入。VB6 里最简单的办法是SendKeysSendKeys Hello SendKeys {ENTER}但SendKeys有局限性它只能发送给当前焦点窗口并且某些安全场景会被拦截。更底层、更可靠的方式是调用 Windows API 的keybd_event或SendInputPrivate Declare Sub keybd_event Lib user32 (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Const KEYEVENTF_KEYUP H2 Sub PressA() keybd_event vbKeyA, 0, 0, 0 按下 A 键 keybd_event vbKeyA, 0, KEYEVENTF_KEYUP, 0 松开 A 键 End Sub这类 API 调用在当时的模拟按键事件源码里很常见可以帮助实现一些程序间的自动化操作比如自动登录、自动录入。不过放到今天安全性审查很严格的系统会拦截这种底层按键模拟所以也别指望随便拿去破解什么软件做个合法的自动化流程没问题。跳转语句热搜词里还有vb6 跳转语句。VB6 里的跳转主要是GoTo 行号/标号和On Error GoTo。比如Sub Demo() On Error GoTo ErrorHandler Dim x As Integer x 1 / 0 触发除零错误 Exit Sub ErrorHandler: MsgBox 发生错误 Err.Description End SubGoTo在结构化编程里口碑不好容易把逻辑搅乱但在错误处理和某些复杂的流程控制里没有更好的替代方案。我的经验是能用 Select Case、If 和函数封装解决的就别用 GoTo只有错误处理标签这种固定套路才值得保留。GDI 初始化热搜词里有条特别细的lnggdiptoken startupgdiplus(gdiplusversion) vb6。这是 VB6 程序使用 GDI 绘图功能的开头。因为 VB6 原生 GDI 不支持抗锯齿、半透明、渐变色这些现代图形效果很多做图像处理的人会通过声明GdiplusStartup和GdiplusShutdownAPI 来引入 GDIDim gdiplusToken As Long Dim gdiplusStartupInput As GdiplusStartupInput gdiplusStartupInput.GdiplusVersion 1 GdiplusStartup gdiplusToken, gdiplusStartupInput 在这里调用 GDI 绘图函数 GdiplusShutdown gdiplusToken这一段代码在当年算高端技巧因为涉及结构体定义、API 声明和 GDI 对象模型比纯粹的控件拖拽要深一层。放到今天看其实就是把绘图环境初始化的步骤封装好了而已但那种用 API 做到 IDE 给不了的东西的快感是那个年代开发者共同的记忆。4.3 老程序的维护心法装好环境、跑通几个例子之后我顺手帮朋友维护过一个仍在企业里运行的 VB6 进销存系统。这几年做这种老系统维护的需求并不少很多制造业、商贸公司还用着十几年前 VB6 写的系统不敢轻易换因为业务数据都在里面换系统的成本太高。维护老程序有几个原则我这些年总结出来的第一先备份完整环境。不只是 .exe 和源代码还有数据库结构、运行库版本、依赖的 OCX 控件文件。最好把整套东西打包成一个压缩包标注好日期。因为你永远不知道哪一天系统就起不来了。第二不要做大重构。VB6 时代的高手们写代码有很多约定俗成但不规范的地方全局变量满天飞、窗体互相调用、错误处理靠 GoTo。你上去把它重构成优雅的分层代码大概率当天就出事故。正确做法是只修改需要改动的 function其他地方保持原样。第三注意对象生命周期。VB6 没有垃圾回收机制窗体、记录集、ADO 连接等对象用完都要手动释放。很多老系统跑久了会内存暴涨就是因为某些窗体只 Load 不 Unload或者 Recordset 没有 Close。排查性能问题先看对象释放十有八九能找到瓶颈。第四保留手写文档。给老系统维护最好的文档不是现找的而是你自己边改边写的那份记录。每次改完一个 bug记录下改了什么、为什么这么改、测试了哪些场景。这些笔记比任何现代化的文档工具都管用。5. 从VB6到现代开发那些没变的东西5.1 对象模型的遗产翻完旧书、跑完老代码我不禁想一个问题VB6 这些东西放到现在还有没有值得学的地方我的答案是有而且不少。最典型的就是控件模型。VB6 里的每个控件都有属性、方法、事件三件套属性描述状态方法提供操作事件通知变化。这个三角模型几乎被所有现代前端框架继承了。React 组件的 props 相当于属性自定义方法相当于方法onClick、onChange 这些事件回调就是事件。Vue 的 props 和 $emit 同样是这个结构。就连 iOS 开发里的 UIView 和 Android 的 View本质上也是属性-方法-事件三件套。你在 VB6 里理解了标签的 Caption 是用来显示文字的点击事件 Click 在用户点它的时候触发再去看现代框架的绑定语法和事件监听思维迁移的成本几乎为零。所以我经常建议刚开始学编程的朋友不要完全跳过这些老古董。花一个周末玩玩VB6把对象模型、事件驱动、循环分支这些底子打牢比直接冲进复杂的框架里摸爬滚打要稳得多。5.2 CPU调度的今昔对比从老 CPU 到现代 CPU变化最深刻的不是主频数字而是调度模型。当年我们用的 Pentium III 是单核单线程操作系统调度简单粗暴一个时刻只有一个进程在用 CPU。程序优化思路也直接减少指令数量、减少内存访问、让代码路径尽量短。VB6 程序员连多线程都不太用得上因为单线程模型下界面卡顿就是真的卡顿得通过 DoEvents 让消息循环喘口气。现在的 CPU 早就是多核 超线程 大小核架构大家的操作系统甚至会细分出性能核和能效核由调度器根据负载动态分配任务。热搜词里的cpu智能核心调度讲的就是这个。这套机制在提升多任务吞吐能力的同时也带来一个有趣的问题当年 VB6 写的单线程程序在如今这个复杂的调度环境下反而能享受单核全速的待遇因为调度器会把它的线程放到一个性能核上跑得飞快。但从软件设计角度看现在的开发者已经不能再用单线程一条道跑到黑的思维了。界面交互和网络请求是两条并行的线状态共享要考虑线程安全响应速度受制于最慢那条链路。这些复杂性是 VB6 时代不存在的也是现在新技术培训里最强调的部分。技术迭代表面上换了一堆工具本质上是不断在解决新的工程问题。5.3 怀旧的价值理解历史才能理解现在整理这一堆旧书旧硬件与其说是怀念那个技术荒蛮的年代不如说是想重新理解技术演化的脉络。很多今天习以为常的东西往前翻都能找到雏形ActiveX 控件是组件化开发的早期形态VB6 的拖拽式 IDE 是现在很多低代码平台的灵感来源ADO 数据访问层是 ORM 概念的前身Winsock 控件让普通人也能写网络程序就像今天的一键连接云服务。翻旧书的意义不仅仅是爷青回而是通过看一个技术方案在当时解决的问题、采用的思路、存在的局限倒推出为什么后来会变成现在这样。比如看到 VB6 里用 On Error GoTo 做全局错误处理你就会理解为什么后来的现代语言要引入异常机制、try-catch、错误类型系统。看到 VB6 的内存泄漏困扰你才会理解现代语言为什么用垃圾回收托管内存。我最终把那些旧书重新放回了箱子但给每本书套上了一个新的防潮袋。那枚 Pentium III 也被我用静电袋装好放回原来的位置旁边多了一张纸条上面写着它的参数和我的联系方式——万一哪天又想折腾点什么还能想起来它在哪儿。如果你手里也有类似的老物件我的建议是别轻易扔。抽个时间装上虚拟机或者老系统把你当年写的第一段 VB6 代码运行一下。哪怕界面已经过时、流程已经繁琐那种当时我怎么就坚持下来了的感觉本身就是一种很难得的收获。最后再分享一个小技巧。如果你在现代系统上跑老 VB6 程序时遇到界面发糊、控件错位的问题右键程序名 - 属性 - 兼容性 - 更改高 DPI 设置 - 勾选替代高 DPI 缩放行为然后在下拉里选系统(增强)大多都能救回来。这个设置比单纯切兼容模式好用得多是我折腾了好几次才试出来的。