首页
开源软件
 
豚豚软件->首页

友情链接

伊信科技



主要提供基于 Windows 平台的个人原创软件储存。

 

VB的无组件化处理

 

什么是无组件化

VB的无组件化是指通过 CreateObject 获取一个 ActiveX 对象,然后通过这个对象变量使用该对象变量对应的类的接口,语法例如:

Set moFS = CreateObject("Scripting.FileSystemObject")。

无组件有什么好处

无组件化可以使用VB的程序有更好的兼容性,理想情况编译的EXE文件直接可以运行在几乎全部版本的 Windows 平台,而且不需要注册组件。

因为 Windows 有大量预装的 ActiveX 组件,这些组件不用注册就可以使用,但这些组件在不同版本的 Windows 平台上的版本并不相同,不能保证完全的二进制兼容,如果你在VB工程中引用,并使用如 Dim moFS As Scripting.FileSystemObject 的语法定义,如果ActiveX 组件二进制不兼容,就会报错。

但如果通过 CreateObject 来使用,即使 ActiveX 组件二进制不兼容,只要接口的参数和类型兼容,就可以正常使用,这样编译出来的VB程序,兼容性最佳。

如何无组件处理

无组件化需要获得更好的兼容性,但 CreateObject 获得的是一个对象变量,在VB的GUI开发环境下是更出属性和方法,开发不够友好。

为了解决这个问题,可以为原有的类创建一个“无组件化“类,该类将原有类的接口封装在“无组件化“类上,具体实现方法可以见 https://gitee.com/SeowPhong/PigObjFs

 

VB6还有用吗

 

VB6即是Visual Basic 6.0,是引入 .NET Framework 之前的终极版本,该软件是 Microsoft Visual Studio 6.0 的重要组成部分,它出现在1999年的《黑客帝国》电影中是VB6的巅峰时刻。

在 .NET Framework 出现后已逐渐被 C# 和 Visual Basic.net 所替代,目前甚至在 GitHub 中被识别成VBA,VB程序员当然知道VB6和VBA不同的,举一个简单的例子,VB6是可以编译成EXE文件的,VBA是运行在Excel文件里面的,只是它们的语法比较类似,代码相互比较容易移植,类似的还有ASP和VBS。

那么VB6这种已经式微的编程语言还有没有用呢?

如果你想用VB6来开发WEB应用程序,即编译成DLL运行在ASP,那基本没有什么用了,因为现在Windows 2008之后的IIS上要部署这样的环境是非常困难的。

如果你想用VB6来开发界面时尚的Windows 桌面程序,那也没什么用,因为VB6开发出来的UI比较古老。

但是如果你对 Windows 桌面程序UI没有要求,却发现VB6有着意想不到的生命力。

因为只要 Windows 在 %windir%\system(32位)或%windir%\SysWOW64(64位)目录下有msvbvm60.dll和stdole2.tlb这两个文件,VB6编译的EXE就可以直接运行,幸运的是即使在最新的Windows 2019版本或Windows 10版本中,无论是32位还是64位版本,都已经预装了这两个文件,这显然比使用 .NET Framework 编译出来的EXE文件在不同的 Windows 版本中有更强的适应性,因为不同 Windows 版本预装的 .NET Framework 是不同的,有些甚至还要另外下载安装包才能安装。

看起来似乎用VB6编译的EXE文件还是非常美妙的,但要在不同版本的 Windows 上很好的运行,还需要满足以下条件

采用 Compile to P-Code 的编译方式,这样编译出来的EXE文件更小而且兼容性更好,除了Win98/95/Me和WinNT没有测试过,像服务器版本 Windows 2000/2003/2008/2012/2016/2019和桌面版本 Windows XP/Vista/7/8/8.1/10上都测试过可以直接运行的,不需要做额外的准备。

不要直接引用 ActiveX DLL,因为这些 ActiveX DLL 的在不同版本Windows中的二进制版本不一定能完全兼容,如果不兼容则不能使用,解决办法是通过 CreateObject 的方式来使用,这样兼容性将大大提高,不过使用 CreateObject 会导致在GUI的编程过程中无法联想列出属性和方法,使用不便,解决办法是创建一个 "Object 化" 的类,将 ActiveX DLL 的接口封装进去,这样就可以部分实现直接引用 ActiveX DLL 的编程体验。

具体的使用案例可以见 https://gitee.com/SeowPhong/PigObjFs

以下列出几种 Windows 自带的 ActiveX DLL,不需要自已使用 regsvr32 去注册的,可以直接 "无组件化" 的方式使用。

64位 Windows 为例
Microsoft ActiveX Data Objects 6.1 Library
Microsoft Scripting Runtime
Microsoft XML, v6.0

使用Windows API函数,VB6绝大部分是能够使用的,只有极少数需要VC才能使用,类似的写法如下:

Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

不要使用安装包制作软件,因为制作出来的安装包EXE文件就可能无法保证在不同版本的 Windows 上运行,同时还有32位与64位之分。

OCX文件的使用,程序用到的OCX文件不要复制到 %windir%\system 或 windir%\SysWOW64 这样的公共目录下,以免和其他软件冲突,只需要和VB6编译出来的EXE文件存放在同一个目录就可以运行了。

完成以上准备后,将VB6编译出来的EXE文件、OCX文件存放在同一个目录,压缩成ZIP文件,就可以发布使用了,在不同 Windows 版本上,只需要解压后直接运行EXE就可以了。

 

豚豚无组件化 FileSystemObject


VB6兼容性

VB6 编译的 EXE 文件几乎可以在所有 Windows 平台上运行。即使是新的 Windows2019,前提是VB6项目中没有引用 ActiveX DLL。

Microsoft Script Runtime

这是VB6开发中经常使用的组件。文件名是 scrrun.dll一般来说,是 Windows 平台预装的,但是不同版本的 Windows 版本的 scrrun.dll 不是二进制兼容的,所以如果在VB项目中引用这个组件,就不能保证它在不同版本的Windows平台上运行。

PigObjFs

这是一个无组件化的 Microsoft Script Runtime,即是 Microsoft Script Runtime 通过 CreateObject 使用,而不是直接引用到 VB 工程中。这样,编译后的 EXE 文件就可以在不同的 Windows 平台上运行了。

如何使用 PigObjFs

方案一

直接引用类文件,这个方案适用于VB6,无需引用DLL,只要把modFsDeclare.bas、pFile.cls、pFileSystemObject.cls、pFolder.cls、PigLog.cls、pTextStream.cls这6个文件加到你的VB6工程中就可以使用。

方案二

这个方案适用于VB6,引用PigObjFsLib.dll实现,编译后的EXE可以直接运行在不同版本的Windows上,但需要通过regsrv32.exe 注册 PigObjFsLib.dll。