简介:面向VB6初学者的综合资料合集,整合基础教程、入门到精通、MSDN、入门例子、控件属性大全与函数速查,覆盖语法、窗体、控件到API调用的学习路径,另附Visual C++ 6.0入门提高讲义(全500页),可解决资料分散问题。包内共3583个文件,chm/htm用于教程检索,dll/ocx为控件与运行库,exe为可直接运行的示例,frm/bas/vbp为工程源码,大量ico/gif/bmp为界面素材,压缩包大小327.4MB,离线可用。已有8222人学习下载。使用时先读基础教程与入门例子建立整体概念,再借控件属性大全和函数速查按需检索细节,MSDN为深入理解系统接口提供支撑,整体是一套理论实践兼备、适合新手系统入门与老手查阅补漏的VB6资料。
1. 还在用 VB6 写工具:这古董到底解决了什么问题
VB6 在很多开发眼里已经是博物馆里的东西,但真正做过企业内部系统维护的人,会明白很多关键流程还在靠它跑。凌晨两点系统告警,开发文档早已丢失,只剩几个 .bas 和 .frm 文件躺在服务器上。愿意接手的人并不少,缺的是对 VB6 这门语言如何与老系统交互、如何正确修改和重新编译的理解。Visual Basic 6.0 基础教程及示例,就是给这类场景准备的:不教你把老系统重写成新框架,而是教你在现有环境下快速读懂、修改,并继续生成能跑的 exe。
这门技术适合三类人:要接手或维护老系统的开发者,想在系统里快速做内部小工具、不想背着几百 MB 运行库的人,以及刚接触编程、想直接用窗体理解事件驱动的初学者。不适合跨平台、高并发、现代化 UI 的场景。认清边界,VB6 就不是玄学,而是趁手的旧工具。
2. 把 VB6 环境搭到 64 位系统上:工程文件结构与最小启动流程
自己搭一个环境,先得有 VB6 的安装介质。现在网上能找到的多是已经整合补丁的版本,安装前先确认系统位数。VB6 是 32 位应用,在 64 位系统上仍然可以运行,但安装程序表现得很挑系统。常见做法是先解压安装包,找到 SETUP.EXE,右键进入“兼容性”标签,把兼容模式设为老版本系统的 Service Pack 模式,再以管理员身份运行。这一步能解决 99% 的“安装程序无法检测到可用系统”类报错。
安装过程中有两个选择要注意。第一,组件选择里尽量勾选“自定义安装”,而不是默认安装,因为后续可能会用到“数据访问”和“ActiveX 控件”里的内容。第二,安装路径不要带空格,也别装在系统盘保护目录下,否则后面的工程引用和编译会遇到权限问题。装完之后顺手把安装介质的补丁包也执行一遍,IDE 的崩溃概率会明显降低。
2.1 安装与激活:一个安装包,两步搞定
安装完成后,第一次打开 IDE 会提示注册,输入安装包自带的序列号即可。这一步没有捷径,不建议去网上找各种“激活工具”,很容易把 IDE 弄坏。安装过程中如果提示“安装程序无法写入文件”或“权限不足”,原因多半是杀毒软件拦住了安装程序对系统目录的写入,临时退出杀毒软件重新安装即可。
在 64 位系统上,IDE 本身跑在 WOW64 兼容层里,所以外接的第三方控件如果是 16 位版本就会装不上。装完 IDE 后,我一般会先建立一个快速测试工程,避免用到某个功能时才发现环境没装全。
2.2 认识 IDE 布局:工具箱、属性窗口、代码窗口
打开 VB6 之后,默认界面分成左中右三块:左边是工具箱,里面放着 CommandButton、TextBox、Label、Timer 这些常用控件;中间是窗体设计器,也就是画界面的画布;右边是属性窗口和工程资源管理器。这几个窗口看起来杂乱,但都可以在“视图”菜单里重新打开。
新手最容易搞混的是控件的 Name 和 Caption。Name 是代码里用来引用控件的变量名,Caption 是显示出来的文字。比如把按钮的 Name 改成 btnCalc,Caption 改成“计算”,那么在代码里写 btnCalc.Click,界面显示的是“计算”。如果反过来把 Name 改了,代码里原有的 Command1 就会变成无效引用,直接报错。
另外要记住 IDE 里有一个“工程/部件”菜单,你可以在这里添加公共控件、网格控件等额外组件。很多网上找到的示例代码用到了 ListView、TreeView 这些控件,如果没有手动添加部件,打开工程时会提示“找不到工程或库”。这不代表代码坏了,只是环境里缺了对应控件。
2.3 一个可运行的最小工程:新建窗体、放按钮、写事件
打开 IDE 后,选择“标准 EXE”模板,系统会默认创建一个名为 Form1 的窗体。从工具箱拖一个 CommandButton 到窗体上,再拖一个 Label 到按钮上方。双击按钮,IDE 会自动跳到代码窗口,并生成一个空的事件过程。在里面写下下面的代码:
' 按钮点击事件:把一段文本显示到 Label 上 Private Sub Command1_Click() Label1.Font.Size = 12 Label1.Caption = "VB6 基础教程:环境已跑通" End Sub这段代码的作用很直接:用户点击按钮,系统将 Label1 的字体大小设为 12 号,并把 Caption 改成一句话。需要说明的是,整个事件过程的名称由“控件名称_事件名”组成,Command1 是按钮的 Name 属性默认值。如果你把控件 Name 改成 btnOk,事件过程就会自动变成 btnOk_Click。手写事件名时漏掉下划线或者大小写不一致,IDE 都会在编译时指出错误。
按 F5 运行,点击按钮,看到标签文字变化,就说明整个环境链路已经通了一半。接着按 Ctrl+F4 结束运行。为什么说只有一半?因为还要验证生成 exe 是否成功。在菜单栏选择“文件/生成 工程1.exe”,生成到指定目录,再双击运行一次,这样 IDE 和编译器都验证过了。
2.4 看懂工程文件:vbp、frm、bas、ctl 各管什么
一个 VB6 工程在磁盘上不是单个文件,而是一组文件。工程文件 .vbp 是整个项目的入口,它记录了工程里包含哪些窗体、模块、控件引用,以及编译选项。窗体文件 .frm 保存窗体界面设计和窗体级代码,如果你在窗体上画了控件,控件的属性值和事件代码都在这里。
纯代码模块的扩展名是 .bas,它不包含界面,通常放一些通用函数、全局变量和数据库连接逻辑。如果工程中自定义了 ActiveX 控件,会产生 .ctl 文件。当你用记事本打开 .frm 文件时,会看到很多类似“Begin VB.Form Form1”的文本,这是窗体设计的文本表示;真正要手工改代码时,还是建议回到 IDE 里改,免得格式出错。
遇到别人发给你的工程,拿到后先检查 .vbp 引用的路径是否存在。最常见的问题是源码目录变了,但 .vbp 里写的相对路径没对上。好在 VB6 在找不到文件时会弹窗让你手动定位。不要一上来就点“取消”,耐心把缺失的 .frm 或 .bas 补上,工程才能正常加载。
3. 基础语法手册:变量、分支与循环的 VB6 写法
VB6 的语法风格和 VBA 同源,信息量不大但细节多。新人容易带着 C 语言的思维来写,结果在类型转换和默认传参上翻车。这一章把最常用的语法点过一遍,每个点都配一个可直接运行的代码片段。
3.1 变量声明与数据类型:Dim 的三种作用域
VB6 里声明变量用 Dim,后面跟变量名和 As 类型。类型不写也行,但那样就成了 Variant,占用空间大、运行时性能差,还要承担类型转换的意外。我一般要求所有变量都显式声明类型,并在模块顶部的“声明区”写上 Option Explicit,强制编译器检查未声明变量。开头的典型写法:
Option Explicit Private Sub Form_Load() Dim i As Integer Dim strName As String Dim dblValue As Double Dim blnFlag As Boolean i = 10 strName = "Hello" dblValue = 3.14 blnFlag = True End Sub变量声明的位置决定它的作用域。写在过程内部,只有这个过程中能访问;写在窗体模块的顶部、且用 Private 声明,只能在这个窗体的代码里访问;写在标准模块 .bas 顶部、用 Public 声明,整个工程都能访问。三者用错会带来两种报错:找不到声明,或者变量被窗体级同名变量“遮盖”。排查时先在顶部找一遍同名变量,是最快的办法。
数据类型也要踩准。Integer 是 16 位整数,表示范围只有 -32768 到 32767。循环计数器超过这个范围,就会溢出变成负数。Long 是 32 位整数,日常计算更安全。Double 做浮点运算,Currency 用于金额,避免浮点误差。Boolean 实际会保存为 -1 和 0,这一点和 C 语言的 0/非0 完全不同;在判断时不能依赖真值非0。
3.2 分支:If、Select Case 以及条件运算的坑
分支结构无非 If 和 Select Case。需要注意 VB6 的 If 必须使用 End If 结束,且 ElseIf 中间没有空格。多条件分支的场景,我更倾向用 Select Case,因为它能把判断值集中在一起,逻辑清楚很多。下面是一个成绩分档的示例:
Dim score As Integer score = 85 If score >= 60 Then MsgBox "及格" ElseIf score < 60 Then MsgBox "不及格" End If Select Case score Case 90 To 100 MsgBox "优秀" Case 60 To 89 MsgBox "及格" Case Else MsgBox "不及格" End SelectSelect Case 的 Case 后支持三种写法:单个值,比如 Case 60;区间,比如 Case 60 To 89;条件表达式,比如 Case Is > 100。注意区间判断是按顺序匹配的,第一个命中的分支生效,后面的分支不会执行。所以写区间时要保证范围没有重叠,否则后面的分支形同虚设。
条件运算的坑在于 And/Or 不是短路运算。VB6 中 If 条件里的 And/Or 会把左右两边都求值出来,再做逻辑与或。如果左边是检查对象是否为空 Is Nothing,右边立刻访问这个对象的属性,就会在左边已经判断为真的情况下继续访问右边,引发运行时错误。常见做法是把判断拆成两层 If,或者用嵌套分支,避免依赖短路逻辑。
3.3 循环:For、Do Loop 与集合遍历的边界
For 循环适合已知次数的情况,Do Loop 适合未知次数的情况。写 For 循环时,计数器变量的变化在循环内部是可见的,因此你可以在循环体里修改计数器的值来提前跳转,但不建议这么做,因为会让循环次数变得不可控。示例:
Dim i As Integer Dim total As Long total = 0 For i = 1 To 10 total = total + i If total > 20 Then Exit For End If Next i ' Do While 循环:先判断后执行,可能一次都不执行 Dim j As Integer j = 0 Do While j < 3 j = j + 1 LoopExit For 和 Exit Do 是提前退出循环的关键字。循环嵌套时最好在注释里标明是哪一层循环,不然排错时很难判断退出的是哪一层。Do Loop 还有另一种写法:Do...Loop Until,条件写在底部,循环体至少执行一次。两者选哪个,取决于需求是“先看条件后干活”还是“先干一次再看条件”。
数组遍历时,尽量使用 LBound 和 UBound 取上下界,不要假定下标从 0 开始。VB6 的数组默认下标是 0,但你可以声明 Dim arr(1 To 10) As Integer,强制下标从 1 开始。直接用固定数字去遍历会让代码在遇到这种数组时报“下标越界”。遍历动态数组时尤其要注意,因为 ReDim 之后 UBound 可能已经变了。
3.4 过程与函数:Sub、Function、参数传递 ByRef / ByVal
VB6 的过程有两种:Sub 是没有返回值的过程,Function 是有返回值的过程。调用函数时,可以直接把返回值赋给变量。参数传递的默认方式是 ByRef,也就是传引用;如果被调用的过程修改了参数值,调用者里的原变量也会跟着被改。这个特性经常造成隐蔽的问题,所以在定义参数时,我基本都用 ByVal 显式声明:
' 函数:计算两数之和 Function AddNumbers(ByVal a As Long, ByVal b As Long) As Long AddNumbers = a + b End Function ' 过程:输出欢迎信息 Private Sub PrintMessage(ByVal msg As String) Debug.Print msg End Sub Private Sub TestCall() Dim x As Long Dim y As Long x = 10 y = 20 PrintMessage "结果是:" & AddNumbers(x, y) End Sub过程名后面如果写了 ByVal,表示传值,过程内对参数的修改不会影响外部变量;默认不写,则是 ByRef,外部变量会跟着变。很多时候你发现一个函数“莫名其妙”把传入的变量改了,大概率就是漏写了 ByVal。另外,函数返回值赋值用的是函数名,而不是 Return 关键字,这和后来的 VB.NET 差别很大。如果你以前写的是 VB.NET,回到 VB6 时最容易在这里犯错。
参数传递还有一个细节:String 类型按 ByVal 传值时会复制一份字符串,如果字符串很长会占用内存。但在绝大多数场景下,这个开销可以忽略,优先安全,再考虑性能。写通用模块时,参数加 ByVal 能让模块的输入输出边界更清晰,别人调用时也不会一头雾水。
4. 做一个能用的示例:简易薪资计算器(含代码清单)
基础知识讲完,现在做一个完整的示例。这个示例非常贴合内部工具的常见需求:输入两个数值,根据规则算出一个结果。这里做一个简易薪资计算器,界面不强求美观,重点是梳理事件驱动、数据校验和数值计算的完整链路。
4.1 需求拆解与界面设计:三个输入框、一个按钮、一个标签
先想清楚程序要做什么。用户填入基本工资和补贴金额,点击“计算”后,程序算出应发合计,并按一个简化比例估算税费,最后把税后收入显示在界面上。这里的业务规则可以是死的,也可以是配置的,示例用常量代表税率常数,便于修改。
界面上放置以下控件:
- TextBox 用于输基本工资,命名为 txtBasic;
- TextBox 用于输补贴,命名为 txtSubsidy;
- CommandButton 用于点击计算,命名为 btnCalc;
- Label 用于输出结果,命名为 labResult。
注意,很多新手会把 TextBox 的显示内容直接用作计算值,但 Text 是字符串,必须先转成数值。界面布置时,建议把每个输入框前面的说明 Label 也放好,否则用户不知道要填什么。示例工程里可以不追求美化,但要把 Tab 键顺序调好:在菜单“视图/Tab 顺序”里让 txtBasic 第一、txtSubsidy 第二、btnCalc 第三,这样用键盘也能操作。
4.2 核心逻辑:输入校验、计算应发与税费、输出结果
双击 btnCalc,进入 Click 事件,依次完成输入校验、计算、输出三步。代码如下:
Private Sub btnCalc_Click() Dim dblBasic As Double Dim dblSubsidy As Double Dim dblGross As Double Dim dblTax As Double Dim dblNet As Double ' 校验输入:两个输入框都必须是有效数字 If Not IsNumeric(txtBasic.Text) Then MsgBox "基本工资必须是数字" txtBasic.SetFocus Exit Sub End If If Not IsNumeric(txtSubsidy.Text) Then MsgBox "补贴必须是数字" txtSubsidy.SetFocus Exit Sub End If ' 读取输入并计算 dblBasic = CDbl(txtBasic.Text) dblSubsidy = CDbl(txtSubsidy.Text) dblGross = dblBasic + dblSubsidy dblTax = dblGross * 0.1 ' 示例用 10% 税费比例,实际根据业务调整 dblNet = dblGross - dblTax ' 输出结果 labResult.Caption = "应发:" & Format(dblGross, "0.00") & _ " 税费:" & Format(dblTax, "0.00") & _ " 实发:" & Format(dblNet, "0.00") End Sub代码的关键点有三个:第一,IsNumeric 判断文本框里内容是不是数字,避免用户输入“abc”导致运行时类型转换错误;第二,CDbl 把字符串转成 Double,该函数无法转换时会抛出错误,所以必须在转换前做校验;第三,Format 函数把计算结果格式成两位小数,避免显示出一长串浮点数。
这里的税率 0.1 是写死的,实际场景中更合适的做法是放到一个标准模块的公共常量里,或者从配置文件读取。这样下次调整税率时不需要打开窗体代码,只改一个地方。另外,文本框输入的负数和超大数字也会通过 IsNumeric 校验,所以如果你对金额有非负要求,还要加一个 <= 0 的判断。示例因为没有严格要求,暂时留空,但生产代码不建议省这一步。
4.3 处理输入异常:Val、IsNumeric 和空值的区别
VB6 里有几个非常容易混用的数值转换函数:Val、CDbl、CInt,以及判断用的 IsNumeric。Val 遇到字符串开头是数字时会尽力解析,直到遇到非数字字符。比如 Val("12abc") 会返回 12,而 IsNumeric("12abc") 返回 False。这意味着,你用 Val 做转换,即使字符串包含字母,也会得到一个“部分数字”,后续计算可能得出错误结果而不会报错。所以我更推荐“IsNumeric 校验 + CDbl 转换”组合。
空值也需要处理。文本框初始内容为空字符串,IsNumeric("") 返回 False,所以不会通过校验。但如果用户只按了一下空格,空字符串变为一个空格,IsNumeric(" ") 仍然返回 False,这一点可靠。反而要小心的是输入了逗号,比如“1,000”,IsNumeric 返回 True,但 CDbl("1,000") 在某些区域设置下会报错或转换为 1。如果你预期用户会输入千分位逗号,需要先替换掉:
Dim sText As String sText = Replace(txtBasic.Text, ",", "") If IsNumeric(sText) Then dblBasic = CDbl(sText) End If这个替换逻辑写起来简单,但很容易被忽略。区域设置还可能把小数点视为逗号,这时 CDbl 的行为也受系统区域影响。为了程序稳定,我一般会在工程属性里指定英文小数点,或者在代码里统一用 Str 转换函数。具体做法要根据部署环境决定,但至少你要知道这里有变量。
4.4 编译成 exe:从代码到可执行文件的两种方式
写完点击事件后,需要编译成 exe。菜单栏选择“文件/生成 工程1.exe”,会弹出保存对话框,确认路径后 VB6 就开始编译。编译时下方的“立即”窗口会显示编译进度,如果代码有语法错误,会停在错误位置并高亮。修改后再重新生成,VB6 会覆盖旧 exe。这是最常规的做法。
第二种方式是使用“文件/生成工程组”,适用于一个工程组包含多个 exe 或 ActiveX 组件的情况。普通工具用不到,但如果你维护的是一个包含多个工程的解决方案,就必须用这个入口。生成 exe 后,直接双击运行时,VB6 编译出来的程序不完全依赖开发环境,但依赖 VB 运行库。在比较干净的机器上,需要把这个运行库一并带上,或者用安装包工具把运行库打包进去。
编译还有一个容易被忽视的属性:在“工程/工程属性/编译”里,选择“编译为本地代码”或“编译为 P 代码”。默认通常是本地代码,运行速度稍好。P 代码更接近之前的解释执行,体积小但在低速机器上明显慢。对内部工具来说,本地代码值得优先选。
5. VB6 常见踩坑与排查:从“内存溢出”到“控件不注册”
老技术有一个特点,问题不在语法上,而在环境和历史包袱上。我积累了不少踩坑记录,这里挑几条最有代表性的。
5.1 现象:双击窗体就崩溃,显示“引发的代码是 0xc0000005”
有一次在 64 位系统上打开一个老工程,双击某个窗体,IDE 直接崩溃。原因不是代码,而是这个窗体里用到一个第三方控件,该控件的 OCX 文件版本和当前系统不兼容。VB6 IDE 在加载窗体时会实例化控件,控件崩溃会把 IDE 一起带崩。
解决办法:先不要双击窗体,而是用记事本打开 .frm 文件,找到 Object = 那一行,看看引用的控件是哪个。然后把对应的 OCX 文件单独注册一下,或者换成兼容版本。还要检查“工程/部件”里是否勾选了这个控件。如果控件确实找不到,只能把该窗体里的控件删除或注释掉相关代码,再尝试打开。
5.2 现象:TextBox 输入中文后保存的字符串变成乱码
这个问题常见于从 VB6 程序向文本文件或数据库写入中文。直接原因是程序没有按 UTF-8 格式写入,而是用了系统默认的 ANSI 编码;遇到中文环境还好,但部署到非中文系统时就会乱码。解决方案是在写入文件时显式指定编码,用 ADODB.Stream 创建 UTF-8 格式的流,再写入字符串。
Dim stream As Object Set stream = CreateObject("ADODB.Stream") stream.Type = 1 stream.Charset = "UTF-8" stream.Open stream.WriteText "中文字符串" stream.SaveToFile "C:\test.txt", 2 stream.Close这类代码看似简单,但 Charset 属性必须放在 Open 之前设置,否则写入内容仍是 ANSI。如果你没引用 ADODB,可能需要先在“工程/引用”里勾选“Microsoft ActiveX Data Objects”。在大多数 VB6 环境里这个库已经在列表里,找不到时先刷新引用。这个坑排起来不费力,但能让人一头扎进去半天。
5.3 现象:编译好的 exe 在新系统上报错“未找到方法或数据成员”
报错信息提示代码里调用了一个不存在的方法或属性。常见原因是编译 exe 的机器上安装了较新的公共控件版本,而运行机器上的公共控件版本较旧,接口不一致。比如代码里用了 ListView 的某新属性,在旧版本控件上就没有。调试时 IDE 在开发机上能跑,但部署后到客户机上就崩。
解决办法:先把开发工具的公共控件版本和部署机的版本对齐。最简单的方式是查看工程中“部件”里对应控件的版本信息,并确保目标机器安装了相同或更高版本。尽量不要在代码里使用高版本控件才有的新接口,除非你能保证部署环境统一。这个问题的隐蔽性在于它往往到现场才暴露,很难在开发机上复盘。
5.4 现象:运行时提示“无法加载 ActiveX 控件”,控件列表是空的
发布程序时,忘了把用到的 .ocx 文件一起分发,或者在目标机器上未注册。VB6 开发机注册了控件,所以本地运行一切正常。到别的机器上,系统提示找不到控件或组件。解决办法是使用 Regsvr32 注册这个 OCX 文件,并在程序安装时加上检查逻辑。
在安装包制作阶段,最好把用到的 OCX 文件放到程序目录,并在安装脚本里执行注册。如果用户环境下没有权限注册,可能需要管理员权限。对于依赖复杂控件的程序,我习惯在启动时检查 CreateObject 是否成功,失败时给出明确提示,而不是让系统弹晦涩的注册表报错。这一步能省下大量现场支持电话。
5.5 现象:日期格式化输出变成一堆
VB6 里把日期用 Format 函数转成字符串后,显示为 ####,通常是因为目标列的宽度不够,或者日期值超出范围。如果只是显示 Label 宽度不足,加大 Label 宽度就能解决。但如果是日期本身无效,比如超出年份范围,Format 函数会抛出异常或返回一串 # 号。
正确做法是先用 IsDate 判断日期是否合法,再格式化。还要注意到 VB6 的日期范围从 0100 年到 9999 年,超出范围直接就是无效日期。日期格式化时指定明确的格式字符串,比如 Format(dDate, "yyyy-mm-dd"),不要依赖系统默认区域设置。这样部署到不同区域设置的机器上,输出格式也不会变。这个坑在老项目中非常常见,尤其月底跑报表的时候。
6. 类模块封装与启动参数:把示例升级成可复用小工具箱
写到这里,你已经有能力改代码和编译 exe 了。最后说两个能明显提升编码效率的习惯:一是把可复用逻辑封装到类模块,二是让程序支持启动参数。类模块和标准模块的区别是它更像一个对象,有属性和方法。我们可以把薪资计算逻辑从按钮事件中拆出来,放到一个名为 clsSalary 的类模块里,然后窗体代码只需要创建对象并调用方法:
' 类模块 clsSalary Public Basic As Double Public Subsidy As Double Public Function GetNetSalary() As Double GetNetSalary = (Basic + Subsidy) * 0.9 End Function窗体调用时:
Dim salary As clsSalary Set salary = New clsSalary salary.Basic = 10000 salary.Subsidy = 500 MsgBox salary.GetNetSalary() Set salary = Nothing这样不论界面如何调整,计算逻辑都不会被控件事件干扰。接下来再说启动参数。很多内部工具需要支持双击文件后自动处理,而不是每次点击按钮。VB6 里可以通过 Command 函数读取启动参数。比如我们要让计算器程序支持“自动从命令行取数并显示结果”,在 Sub Main 里读取 Command 返回值即可。使用 Sub Main 作为启动对象,需要在“工程/工程属性/启动对象”里设置为“Sub Main”。程序入口代码可以写成:
Sub Main() Dim arg As String arg = Trim(Command) If arg = "" Then Form1.Show Else Form1.txtBasic.Text = arg Form1.Show End If End Sub这样设计的好处是:自动化脚本可以调用这个 exe 并传入参数,程序启动后自动填入数据,用户再看一眼结果即可,省去了手工输入的步骤。虽然现在有更现代的语言可以做同样的事,但对已经存在的 VB6 工具来说,增加这一层并不会引入额外依赖,维护成本很低。
我自己的习惯是每改完一个 VB6 工具,都重新生成 exe 并把源文件打包固定在备份目录。因为 VB6 工程太容易因为缺少引用而无法再次打开,动手改之前先备份,这是给自己留后悔药。新系统上遇到问题,第一反应不是抱怨环境,而是回到这个工程的 .vbp 文件里看引用清单,环境问题大多是引用路径引起的。掌握这套基础教程和示例的方法,多老的工具都能继续为你工作。希望帮到你。
本文还有配套的精品资源,点击获取