2023年12月15日发(作者:)
用VB编写绿色软件
我认为的绿色软件就是免安装,短小精干的软件,目前的大部分共享软件都属于此类(或向绿色软件靠拢)。
连比较大的phoshop软件也把一些注册项放到一个专门的注册文件(reg文件)里,到时重装的操作系统,只需把reg文件导入的注册表即可。此外比如金山软件,基本上都是不用安装,即可运行。
目前绝大部分的共享软件都是用delphi做的,虽然它的pascal语法让人别扭,可大家还是坚持用,最好的理由就是,它做绿色软件很方便,一个Exe文件基本上什么都搞定了。
用VC做共享软件吧,如果是基于API开发(非MFC)总是有点杀鸡焉用牛刀的感觉(目前的机器配置都比较高,共享软件一般都是应用方面的小程序,不像服务器,对性能要求那么高,再说,用VC开发,周期也相对较长)。
MFC虽然开发相对比较快速,但是也存在一个运行库问题,做成动态链接吧,windows 9X系列的用户无法使用,编译成静态链接吧,软件尺寸一下扩充了1M多,在网络带宽还不富裕的情况下,还是少用为妙。
用VB做绿色软件,也有很多这方面的介绍,不过一个稍微复杂的程序,也带上好多嫁妆:vb运行库,ocx控件等等,如果软件中还使用了数据库(如ADO,DAO等),那能不能做成绿色软件还是个未知数。
不过VB易上手,开发软件较为快速,如果API技术掌握的较好的话,大部分软件都可以较好的实现。如果用VB做共享软件,开发即轻松,又可以增加额外收入,何乐而不为呢?
可是上面所说的问题该如何解决呢?结合我的体会和开发了部分绿色软件的基础上我谈谈我的看法,不当之处,请方家斧正。
第一、针对运行库的问题可以这样解决。目前大部分的用户都是Win2000、XP平台,而win2000以上的平台微软已为我们把运行库添加到系统目录了。(关于这一点,delphi用户很不满,认为这是不公平竞争,VB的运行库、MFC的运行库都集成到系统了,这样delphi至少在软件大小上已远远的落后VB和MFC开发的软件了),所以这部分用户不用考虑运行库的问题,对9x系列的用户,可以把VB运行库放在网上,需要的话让用户直接从网上下载。如果你觉得不介意软件尺寸的话,也可以把运行库和你的软件一起发布(直接把运行库放到当前软件的同一目录即可)。
目前虽说微软不支持VB了,但是只要Windows的后续版本照样集成VB运行库,用VB开发共享软件还是大有前景的(微软上百兆.net平台都敢集成,更何况区区1.25M的VB运行库呢?我对此乐观:)
第二、如果用VB开发共享软件,我建议仅用VB的基本控件,此外不要用DAO,ADO等数据库操作控件(或引用),如果操作数据,我建议自己定义数据库格式(可以仿照dBase等数据库格式),在数据量不算大的情况下(比如1万条记录以下),完全可以这样做,目前的用户机器都比较高档,没必要考虑太多的性能问题。这样的话仅需要运行库即可运行VB程序,在Win2000以上系统,直接就可以运行。
第三、软件界面为了美观,直接用image控件贴图即可,这种方式我一直爱用。对多语言版本,可以采用读取ini文件方式,也可以直接读取VC编译的纯资源文件。
第四、软件开发完毕后,最好用exe压缩软件压缩一下,这样有两个好处,一是对被人破解加了一个障碍,二是,软件尺寸大大减小,利于发布。
第五、至于加密,那是仁者见仁,智者见智的事了,这里我就没必要多谈了。
随着计算机的不断发展,操作系统的不断更新,硬盘容量、内存容量及相应的存取速度不断提高,使得开发出来的应用程序不再只是单一的可执行文件,特别是Windows应用程序,微软在Windows中引入了一个非常好但管理不方便的新东西──动态链接库DLL。这样开发出来的应用程序本身变小了,可相应辅佐运行的DLL文件变多了,而且在Windows中开发的程序,特别是用VB开发的程序往往要用到第三方控件OCX。这样,开发出来的程序就不容易管理,而且Windows应用程序一般都需要安装。而卸载往往又不彻底,常常会保留一些所谓的共享文件。安装一个、两个这样的程序倒无妨,安装多了Windows的系统文件夹就会急剧膨胀。绿色软件就是在这种情况下诞生的,它的特点是程序不用安装,拷贝或解压到一个目录下就可以运行,卸载只要删除整个目录就OK了。
下面我们来谈谈怎样用VB 6.0编写一个绿色软件。
首先,用VB编写好应用程序。需注意的是,一些用不着的第三方控件最好不要保留在工程中,这样开发出来的程序相对较小,并生成EXE文件。
其次,程序编好后,退出开发环境,启动VB 6.0中文版工具──Package & Deployment向导。用向导将应用程序打包。完成后用Winzip 8.0或其他能打开并能解压CAB文件的压缩工具打开安装目录下的,并解压到一个临时目录,删除和文件(特别注意和必须带上,否则程序无法运行)。
再次,将应用程序本身要调用到的下级目录一起拷贝到这个临时目录中。如没有则跳过这一步。
最后,将这个临时目录中的文件整理一下。如果你认为这些文件大了些,你可以用ASPACK或其他一些可执行文件压缩工具将这个目录中的可执行文件、DLL文件、OCX文件压缩一下,用VB编写的程序一般经压缩后大小只有原来的30%。如果运行稳定就可以将BAK文件删除,不行则恢复到原来的面貌。
现在你可以将这个目录改成你所需的名字,打包就可以发行了。它能在没安装VB的机器中正常运行,怎么样,去Try一下吧,自己也来开发绿色软件。
运行环境:Windows98、Visual Basic6.0 中文版(Visual Basic5.0原理基本相同)、Aspack (可选)。
之三:
现在非常流行“绿色”软件,不需要什么安装程序只要一个 EXE 文件就可以运行程序了,而在
VB 的编程中有许多地方需要调用第三方的控件(很难用 API 函数搞定所有的功能),这就需要制做一个安装程序,把所需要的控件、DLL 文件或其他文件打包进去了, 那么在 VB 中怎么用变通的方法实现“绿色”软件呢,请看示例:
1、主程序.EXE
用 VB6.0 编写的程序,调用了 Winsock 控件,如果在没有安装VB5.0、6.0 的机器上运行则会出现错误,导致程序运行失败,这时如果按一般的方法,只有把这个程序用VB5.0、6.0 的安装程序进行打包,不然只有用用2的方法来解决了。
2、注册程序.EXE
用 VB6.0 编写的程序,使用资源文件的方法,把 Winsock 控件封装到本程序中,在运行主程序.EXE之前,先运行本程序,通过API函数GetSystemDirectory取得系统的WinddowsSystem的目录,然后把Winsock控件复制到该目录下,并用Shell来完成控件的注册。
⑴启动 VB6.0,在“外接程序→外接程序管理器”中加载“Visual Basic 6 资源编辑器”
⑵在 VB 资源编辑器窗口中,点击“添加自定义资料”,增加 Winsock 控件(C:),再双击刚刚创建的自定义资源,弹出”编辑属性”窗口,定义如下:
类型: “OCX”
标识号: 101
语言: 中文(中国)
⑶保存资源文件,写如下代码:
Option Explicit
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA"
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
Const MAX_PATH = 260 注释:定义足够长的字符串
Private Sub Form_Load()
Dim TempFile() As Byte
Dim FileNum As Integer
Dim TempDir As String
TempDir = GetWinSysDir 注释:自定义函数取得系统的 WinddowsSystem 的目录
TempFile = LoadResData(101, "OCX") 注释:用以从资源 (.res) 文件装载若干可能类型的数据,并返回一个 Byte 数组
FileNum = FreeFile
Open TempDir & "" For Binary Access Write As #FileNum 注释:新建文件(把
Winsock 控件复制到指定目录下)
Put #FileNum, , TempFile
Close #FileNum
注释:Shell "regsvr32 " & TempDir & " ", vbNormalFocus 注释:注册控件,有弹出对话框
Shell "regsvr32 " & TempDir & " /s", vbNormalFocus 注释:注册控件,无弹出对话框
MsgBox "注册成功,现在本程序可正常运行了!!", vbOKOnly, "注册控件"
Unload Me
End Sub
Public Function GetWinSysDir() 注释:定义读取WinddowsSystem 的所在目录的函数
Dim S As String, Length As Long
S = String(MAX_PATH, 0) 注释:赋值
Length = GetSystemDirectory(S, MAX_PATH) 注释:S为取得目录,MAX_PATH 为长度
S = Left(S, InStr(S, Chr(0)) - 1) 注释:去掉多余的空格
GetWinSysDir = S
End Function
注释:补充:S 和 MAX_PATH 的值是可以随便赋的,
注释:如: Dim S As String * 20
注释: Length = GetSystemDirectory(S, 20)
3、补充说明
在用 VB6.0 保存上述两个程序后,请再使用 VB5.0 重新打开这两个程序,并编译为主程序.EXE、注册文件.EXE。(用 VB5.0 编译的程序,在 Win98、2000 下不需要任何 DLL 文件)
4、程序运行
将主程序.EXE、注册文件.EXE两个文件,复制到任意机器上,先运行注册文件.EXE注册第三方的控件,再运行主程序.EXE,就不会有任何的错误了,一个变通的“绿色”软件就完成了。
之四:
VB-PowerWrap v4.1 汉化版(开发VB绿色软件的好工具)
『软件简介』
VB-PowerWrap 允许开发者在发布他们的程序时不需要再加入一大堆
的 OCX 与 DLL 文件。该程序可以帮助 Visual Basic 程序员在发布他们
的可执行文件时不需要再担心关于其他链接库与 OCX 的问题了。VB-Powe
rWrap 允许你将程序所必需的所有 .dll 文件与 .ocx 文件打包到你的 V
B 程序内部,并且不需要用户安装,直接就可以运行。并且 VB-PowerWra
p 可以自动注册所必需的 .dll 与 .ocx 文件!
VB-PowerWrap 通过扫描一个 Visual Basic 的工程文件,并将该工
程所需要的文件进行打包,然后创建一个包含所有必要文件的可执行文件
供程序员发布。VB-PowerWrap 使用了超强的压缩模块,这样可以创建出
最小的 .exe 文件。
VB-PowerWrap 功能简介:
压缩所有的 DLL 与 OCX 文件
如果需要则在用户的机器上注册必要的控件
不会出现恼人的运行时问题
自动扫描工程所必需的 DLL 与 OCX 文件。
可以用于 Visual Basic 4、5、6 版本中。
之五:Visual Basic中第三方控件使用之金蝉脱壳
在用VB编程中合理的使用第三方控件,往往能够事半功倍。但是使用第三方控件也有不好 的地方,那就是为了保证程序正常运行,必须使程序能够在系统目录或程序目录下找到所 用的第三方控件。要做到这一点通常有两种办法:一是把控件和程序制成一个压缩包发 行,这样的缺点是有可能导致在程序传播过程中丢失控件文件。二是制作安装程序,缺点 是制作过程烦琐。而且上面两种办法也不符合绿色软件的要求。所谓的绿色软件是指软件 只有单个可执行文件且无须安装,目前很受用户欢迎。那么有没有办法在使用了第三方控 件的情况下实现绿色软件梦呢?答案是有。
做法是,将第三方控件以自定义资源文件方式保存在程序中,程序运行之后使用控件之前 将所用到的控件生成到该程序目录下,完成控件从可执行文件中的金蝉脱壳。
具体做法如下:
第一步:将要用到的控件拷贝到当前工程目录下,右键单击该控件,选择属性,记下文件 大小。注意,应记下以字节为单位的具体数字,而不是多少K,以备编程使用。
第二步:引用并正常使用该控件。
第三步:新建资源文件加入工程,在资源文件编辑器中添加所使用的第三方控件为自定义 资源(CUSTOM),资源号使用默认的101。如果使用了多个控件则分别添加到资源文件的 101、资源项中,脱壳代码也要作相应的修改。
第四步:编写控件脱壳代码,使其读取资源文件的数据,在程序当前目录下生成控件。
代码如下:
Private Const OCXSIZE = 57344 `欲生成的控件大小是57344Byte,名字为
Sub Main()
Dim Ocx() As Byte `OCX是个Btye类型的数组
Dim Counter As Long
Ocx = LoadResData(101, "CUSTOM") `将自定义资源中101号资源读入数组OCX
`注意,微软的帮助中对加载自定义资源的说明有错误,自定义资源标识为"CUSTOM"而不 是帮助所说的数字10
If Right(, 1) = "" Then `读取程序所在路径,判断是否为根目录并分别处理
`程序在根目录下
If Dir( & "") = "" Then `程序路径下有无控件,无则生成控件
`以二进制方式写(生成)控件()到主程序所在的目录
Open & "" For Binary As #1
For Counter = 0 To OCXSIZE - 1 `注意因为从0 Byte开始因此以文件大小 - 1Byte 为终值
Put #1, , Ocx(Counter)
Next Counter
Close #1
End if
Else
`程序不在根目录下
If Dir( & "") = "" Then `程序路径下有无控件,无则生成控件
`以二进制方式写(生成)控件()到主程序所在的目录
Open & "" For Binary As #1
For Counter = 0 To OCXSIZE - 1 `注意因为从0 Byte开始因此以文件大小 - 1Byte 为终值
Put #1, , Ocx(Counter)
Next Counter
Close #1
End if
End if
e = True `主程序所用控件已经生成,显示主窗体,进入主程序。
End Sub
注意:将以上代码作为一个模块添加到工程中,并在工程-工程属性设置中将启动对象选 为Sub Main,即上面的脱壳代码。然后编译生成EXE文件,将该EXE文件拷贝到其他没有安 装所用控件的计算机上运行一下看看是否实现了控件携带之金蝉脱壳。如果是那么OK!以 上为使用一个控件的情况,使用多个控件方法基本相同,不在赘述。
模块中
Private Declare Function GetOpenFileName Lib "
" Alias "GetOpenFileNameA " (pOpenfilename As OPENFILENAME) As Long
Private Declare Function GetSaveFileName Lib "
" Alias "GetSaveFileNameA " (pOpenfilename As OPENFILENAME) As Long
Private Const OFN_HIDEREADONLY = &H4
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
'通用打开对话框
'利用API函数代替VB自身的COMMONDIALOG控件,以使得程序可以在其他未装VB的机器上运行
'而不用带上VB的运行库或者制作成安装文件
Public Function CommonDealFile(ByVal hWndParent As Long, ByVal Filter
As String, ByVal InitDir As String, ByVal Title As String, ByVal flag
As Boolean) As String
Dim OFName As OPENFILENAME
Dim Tam As Long
tSize = Len(OFName)
ner = hWndParent
nce = nce
ilter = Filter
ile = Space$(254)
le = 255
ileTitle = Space$(254)
leTitle = 255
nitialDir = InitDir
itle = Title
= OFN_HIDEREADONLY
If flag = True Then
If GetOpenFileName(OFName) Then
ile = Trim(ile)
Tam = Len(ile)
CommonDealFile = Mid(ile, 1, Tam - 1) 'cut char
Else
CommonDealFile = " "
End If
Else
If GetSaveFileName(OFName) Then
ile = Trim(ile)
Tam = Len(ile)
CommonDealFile = Mid(ile, 1, Tam - 1) 'cut char
Else
CommonDealFile = " "
End If
End If
End Function
窗体中
Private Sub Command1_Click()
Dim FileName As String
FileName = CommonDealFile(, " ", , "open ", True)
TRUE时为打开
0
0
'为
If FileName <> " " Then
e = LoadPicture(FileName)
End If
End Sub
Private Sub Command2_Click()
On Error Resume Next
FileName = CommonDealFile(, " ", , "save
", False) '为False时为保存
SavePicture
End Sub
, FileName


发布评论