全部版块 我的主页
论坛 数据科学与人工智能 IT基础
53 0
2025-12-08

在Windows 10环境下成功安装VB6后,我测试了ADODB与ODBC功能:前者用于打开Access 97格式的mdb文件,后者则连接dbase III类型的数据库文件。VB6原有功能基本可用,经过进一步优化和修补,整体运行稳定。对于维护旧系统而言,这套方案非常实用;但若要开发新项目,建议选择更现代的开发工具——当前编程平台丰富多样,编程范式也更加先进。

接下来分享具体操作步骤,首先从预处理阶段开始:

1. 安装前环境检查

进入VB6安装程序目录进行查看:

发现其中包含若干16位组件,在Win10系统中无法直接运行。解决方案是使用开源工具OTVDM(Open Tool for Virtual DOS Machine)。只需解压后运行install脚本即可完成配置。此后当系统尝试执行这些旧程序时,会先按常规方式启动,出错后自动交由OTVDM以16位模式处理。若仍失败则退出,否则正常运行。整个过程自动化,省去手动干预。

2. 配置安装选项:跳过VSS与ADO RDS相关组件

网络上普遍建议在Win10安装VB6时不要勾选“VSS”和“ADO RDS”选项。

  • VSS(Visual SourceSafe):属于版本控制工具,实际很少使用,因此直接取消勾选,无需深入研究。
  • ADO RDS模块:依赖DCOM技术。经检查系统DCOM设置,并查找相关配置程序(如DCOM98、DCM98CFG),发现它们均为16位程序。虽然OTVDM可支持其运行,但Win10因兼容性限制仍会阻止加载,即使调整兼容模式也无法通过。

可通过快捷键 WIN+R 打开运行窗口,输入 dcomcnfg 来查看默认属性及COM安全配置。

既然无法正常运行,也不能让其阻碍安装流程。于是采用替代策略:编写一个空的占位程序,将原有问题程序重命名备份,再用该空程序代替其名称,确保安装器能顺利调用而不报错。

3. 修改安装配置并执行安装

完成预处理后,进入安装配置环节。运行 ACOST.exe 工具进行设置:

在配置界面中取消勾选 VSS、ADO 和 RDS 等不必要项,保存修改。对两个主要配置文件做相同处理以保证一致性。

随后运行 setup.exe 开始安装。由于配置文件已预先设定,后续安装过程将自动按配置执行,无需重复选择,一路点击“确定”即可完成。

4. 单独添加ADO支持功能

考虑到DCOM远程服务主要影响RDS功能,而ADO本身基于本地OLE DB支持,理论上只要系统具备相应组件即可运行。因此再次调整配置文件,重新勾选 ADO、RDS 及 OLE DB Provider 选项,再次运行 setup.exe。

安装程序检测到已有VB6环境,提示可进行修改或卸载。选择“修改安装”,保留原有组件不变。虽然安装过程中未出现错误退出,但在后期更新阶段耗时较长,手动中断了进程。

启动VB6后发现ADO相关控件并未注册成功。于是手动从安装盘的 Shared 目录下提取所需控件文件,复制到系统目录 syswow64 中,并使用 regsvr32 进行注册。

需重点注册的包括:

  • OLE DB 相关组件
  • ADO 核心库文件

上述文件可在以下路径中查找获取:

5. 解决代码编辑器鼠标滚轮失效问题

在Win10系统中,VB6代码窗口常出现鼠标中键滚轮无法滚动的问题。网上有方案通过外接管理器注入DLL插件解决,但我更倾向于驱动级方案。将提供的修复程序(exe)放入开机启动项,系统启动后自动运行,即可激活VB6代码窗口中的鼠标滚轮功能。

6. 改善高分辨率下的显示模糊问题

在1920x1080分辨率、缩放比例设为125%的显示器上,VB6界面字体模糊、外观不佳,这是多数老软件共有的兼容性问题。解决方法是强制程序使用 comctl32.dll 的6.0版本。

具体步骤如下:

  1. 提前准备好所需的清单(manifest)脚本内容。
  2. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
     
        <assemblyIdentity
            version="1.0.0.1"
            processorArchitecture="*"
            name="MyAppName.exe"
            type="win32"
        />
        <description>Optional MyDescription for MyAppName.exe</description>
     
        <asmv3:application>
            <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>true</dpiAware>
            </asmv3:windowsSettings>
        </asmv3:application>
     
        <!-- Compatibility section for Program Compatibility Assistant (PCA) -->
        <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
            <application>
                <!-- Windows Vista -->
                <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
                <!-- Windows 7 -->
                <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
                <!-- Windows 8 -->
                <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
                <!-- Windows 8.1 -->
                <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
                <!-- Windows 10 -->
                <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
            </application>
        </compatibility>
     
        <!-- Trustinfo section for User Account Control (UAC) -->
        <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
            <security>
                <requestedPrivileges>
                    <!-- level   = "asInvoker"            -->
                    <!-- level   = "highestAvailable"     -->
                    <!-- level   = "requireAdministrator" -->
                    <requestedExecutionLevel
                        level    = "asInvoker"
                        uiAccess = "false"
                    />
                </requestedPrivileges>
            </security>
        </trustInfo>
     
        <!-- Dependency section -->
        <dependency>
            <dependentAssembly>
                <assemblyIdentity
                    type="win32"
                    name="Microsoft.Windows.Common-Controls"
                    version="6.0.0.0"
                    processorArchitecture="*"
                    publicKeyToken="6595b64144ccf1df"
                    language="*"
                />
            </dependentAssembly>
        </dependency>
     
    </assembly>
  3. 使用 ResHacker 工具,点击 Action → Add a new resource → Open file with new resource,任意打开一个文本文件作为占位资源。
  4. 在类型栏输入 24,名称输入 1,点击 Add Resource 添加自定义资源。
  5. 此时 NewHints.txt 袄容被加载,全选内容(Ctrl+A),替换为准备好的脚本代码。
  6. 点击 Compile Script 编译脚本,然后通过菜单 File → Save 保存修改。工具会生成新文件并自动备份原始exe。

注:ResHacker 支持脚本化操作,可将图标更换、资源嵌入等任务写成脚本实现批量处理。

7. 实现标准DLL项目的构建支持

VB6原生编译流程为:源码经 C2.exe 编译生成 .obj 文件,随后由 link.exe 连接生成目标文件,并删除中间obj文件,全过程高度集成。

传统做法是制作一个带窗体的假 link.exe,在弹出时手动拷贝 obj 文件,确认后再交由真正的 link2.exe(即原 link.exe 重命名而来)完成链接。

我的改进方案是:截取编译EXE和DLL时C2.exe传递的命令行参数,编写一个中间转换程序,精确控制编译与链接流程,从而实现标准DLL项目的完整构建能力。

之前在网上看到一位网友分享了一款集成了标准DLL模板的实用工具,我亲自测试了一下,整体运行效果不错。虽然偶尔会出现小错误,但只需保存当前工作并退出,随后重新启动VB6即可恢复正常。

既然已有现成且稳定的解决方案,就没有必要重复开发。在此,我对这位提供免费工具的同学表示由衷的感谢,感谢他的无私分享。

经过配置和调整后,VB6现已能够稳定运行,功能完善,可满足日常开发需求。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群