到最后,也就是现在,Blog的相册[Album]终于弄好了,增加了列表浏览方式,支持按分类,推荐等方式进行浏览
现在已经OK了,快去看看吧.
到最后,也就是现在,Blog的相册[Album]终于弄好了,增加了列表浏览方式,支持按分类,推荐等方式进行浏览
现在已经OK了,快去看看吧.
现如今这社会时髦这个词用的可是多啊,那到底什么叫时髦,如何定义,如何诠释呢?
下面这些是百度到的
●时髦起源于创造服装行业(社会心理学)
●社会中对于时尚极端注意与极端不注意的属于少数人,而绝大多数人是随着少数时尚分子转移〈社会心理学〉
●风俗是历代相传的行为规则,而时尚则是现时流行的行为规则
●时兴的风靡是贫者的巧智向富人的虚荣心收税(桑弗)
●流行是不显眼的人模仿引人注目者的行为。其结果流行将自动地变化(瓦莱里)
●流行聪明人虽然嘲笑它,却还是服从这暴君命令(毕尔斯)
●时髦是摆脱了粗俗之后的优雅;因而,它最怕被新的时髦所代替(威·赫兹里特)
●高雅时髦与丑陋粗俗是人性这块普通硬币的两面—-(赫·乔·威尔斯)
●时髦永远是个任性的孩子(威·梅森)
●时髦是仲裁者,是衡量是非的标尺(斯梯尔)
●一代人眼中的新奇往往只是重新复活的上一代人的时髦—-(肖伯纳)
●追逐“流行”的女人,经常是恋着自己的(托罗什富科)
●一切时髦的东西都会过时,所以倘若你追时髦,那么你老了以后,就会变成一个谁也不肯信任的、徒有外表的人(舒曼)
●时髦的玩艺儿,只要表面的光彩一脱,显然就无价值可言—(莫里斯)
●时髦往往同无知结伴,而无知的时髦则加倍卑俗(苏联)
●一个人不可能是既时髦又出类拔萃(洛·史密斯)
●时髦常常发出阵阵刺耳的吆喝,使唤我们这些多变的瘦马,像愚人一样去追逐最破烂的废物和最廉价的玩偶(沃尔科特)
●我们真实的愿望仅仅是求异,从这一边摇摆到那一边,而且每一次新的摇摆都受到热烈欢呼,前一次摇摆得到的却是蔑视—-(伯纳德·贝伦)
●时髦虽然是愚蠢的产儿,傻瓜的向导,但它却能主宰最聪明的人,主宰学界(乔·布莱克)
发生在自己身边的时髦事有吗?有,前些日子网上刮起一阵博客风,好大啊,我也被卷进来了,弄了个博客;后来看人打网球,心理就痒痒了,心想这么好的运动怎能不玩,虽然网球这项运动不是新兴的,但是是有地域性的,至少在烟台这个地方还没有那么普及,我们一伙人也打,而且现在已经打的很好了,也叫时髦吧,呵呵.
随着时间的推移,还会有更多的时髦的事要发生,但不是所有的时髦都适合自己,这就需要自己去判断,盲目的跟随时髦可不是好事啊.
静观其变吧!
这是一篇笔记,是迷糊师姐的,嘿嘿,先这么叫着吧,她接触Instalshield比较早,因此有很多经验,这是其中的一部分,再与大家分享!
===============================================================================
InstallshieldX安装制作杂记(实例之自定义对话框)
如何调用自定义对话框?Installshield帮助中有说明,但有一些环节弄不好就无法实验成功。比如ControlID,DialogID等。
通过自己的摸索,我完成了自定义对话框的建立、事件编写已经调用,现整理出来,希望能给大家提供帮助。
1.新建对话框
(1)在User Interface->dialogs中新建一个Dialog,命名为fbysssDialog;
(2)通过Control tool bar加入一个Text Area,Text属性填入"我的自定义对话框";
(3)加入三个Push Button,分别设置Text属性为Back,OK,Next,Control Identifier分别设置为14,13,15。其他控件可以根据需要添加;
(4)Additional Tools->Direct Editor找到Dialog,设置fbysssDialog的ISResourceID为10333(如果有重复就改变数字)。
2.编写对话框事件
新建一个脚本文件,命名,比如叫"fbysssDialog.rul"
粘贴如下代码:
#define RES_DIALOG_ID 10333//对话框的ID
#define RES_PBUT_NEXT 15 // Next 按钮的ID
#define RES_PBUT_OK 13 // OK按钮的ID
#define RES_PBUT_BACK 14 // BACK按钮的ID
#include "Ifx.h"
export prototype ExFn_DefineDialog(HWND);
function ExFn_DefineDialog(hMSI)
STRING szDialogName, szDLLName, szDialog;
NUMBER nDialog, nResult, nCmdValue;
BOOL bDone;
HWND hInstance, hwndParent;
// STRING sValue;
begin
szDialogName = "fbysss的自定义对话框";
hInstance = 0;//默认值
szDLLName = ""; ////默认值
szDialog = "";//如果指定了对话框的ID,这里就设置为空字符串。
hwndParent = 0;//保留参数,必须为0
nResult = DefineDialog (szDialogName, hInstance, szDLLName,
RES_DIALOG_ID, szDialog, hwndParent,
HWND_INSTALL, DLG_MSG_STANDARD|DLG_CENTERED);
// 错误检查
if (nResult < 0) then
MessageBox ("出错了.", SEVERE);
bDone = TRUE;
abort;
endif;
bDone = FALSE;
//循环
repeat
//显示对话框,nComValue返回在对话框中的事件,如果正常,返回Control ID
nCmdValue = WaitOnDialog(szDialogName);
//NumToStr(sValue,nCmdValue);
//MessageBox(sValue,INFORMATION);
switch (nCmdValue)
case DLG_CLOSE:
// 关闭窗口
Do (EXIT);
case DLG_ERR:
MessageBox ("无法显示自定义对话框,安装取消.", SEVERE);
abort;
case DLG_INIT: ;
//初始化,啥不不干
case RES_PBUT_OK:
// OK按钮被按下
MessageBox("OK按钮被按下了。",INFORMATION);
case RES_PBUT_NEXT:
MessageBox("Next按钮被按下了。",INFORMATION);
bDone = TRUE;
case RES_PBUT_BACK:
MessageBox("BACK按钮被按下了。",INFORMATION);
bDone = TRUE;
endswitch;
until bDone;
//关闭对话框
EndDialog (szDialogName);
//释放内存
ReleaseDialog (szDialogName);
end;
3.调用对话框
在Setup.rul头部加入#include “fbysssDialog.rul“
ExFn_DefineDialog(0);//调用,这句话根据需要写在相应的地方。比如一开始就显示,写在function OnFirstUIBefore() 的begin之后。
编译运行,是不是看到效果了?cool!
InstallshieldX安装制作杂记(实例之安装完成)
我们可以看到,很多软件在安装完成之后,可以有一些选项,比如“查看ReadMe”,“运行程序”等等,这是怎么做到的呢?
关键词:OnMoved、SdFinish
1.InstallShieldX脚本中有一个OnMoved事件。这个事件在需要安装的文件拷贝完成之后触发;
2.SdFinish是一个标准对话框函数,函数原型为SdFinish ( szTitle, szMsg1, szMsg2, szOpt1, szOpt2, bvOpt1, bvOpt2 );从参数中可以发现,这里只提供最多两个选项。
实例代码如下:
function OnMoved()
STRING szTitle;
STRING szMsg1, szMsg2,szOpt1,szOpt2;
BOOL bvOpt1, bvOpt2;
STRING szApplicationPath,szApplicationCmdLine,szCmdLine;
begin
if (MAINTENANCE) then return 0;endif;//如果不是安装状态,比如修改/卸载状态的时候,则不执行。
szTitle = "安装完成";//对话框的标题
szMsg1 = "%P 安装已经完成.n" +
"请根据需要选择下面的选项.";//%P为软件产品名称
//如果要单独在这里设置产品名称,在之前使用如下两句
// szProductName = "某某软件";
// SdProductName (szProductName);
szMsg2 = "点击‘完成’按钮完成%P安装.";
szOpt1 = "阅读自述文件";//如果这里为空,则表示只有一个选项
szOpt2 = "运行程序";
SdFinish (szTitle, szMsg1, szMsg2, szOpt1, szOpt2, bvOpt1, bvOpt2);
if (bvOpt1) then
LaunchApp (‘notepad.exe’,TARGETDIR ^ "\readme.txt");//LaunchApp 用来运行某外部程序
endif;
if (bvOpt2) then
LaunchApp (TARGETDIR ^ "\App.exe","");
endif;
end;
InstallshieldX安装制作杂记(经验点滴)
1. 安装类型:
Universal Project是为了适应不同操作系统而作。
InstallScript Project最为灵活,Windows Installer页中的project需要 windows installer server 支持,但有速度快,文件小的优点。
2. InstallScript MSI project 可以转换为InstallScript Project:菜单project->Convert to InstallScript Project.
3.常用函数:
NumToStr,StrToNum 整型和字符串相互转换。
InstallShield X制作安装程序杂记(7.Behavior and Logic节点)
1.InstallScript(安装脚本):安装文件是InstallScript Project的重头戏,可以通过编写安装脚本文件,来对安装程序进行深层次的处理。其中提供了一些标准函数、事件,也可以自定义函数,代码风格有点类似C。
如何使用脚本来“滋润”安装程序,后文将用专门篇幅实例说明。
2.Support Files/Billboards(支持文件,后面的不知道咋翻译好):一些安装过程中需要读写的文件,可以添加到这里。后文实例中将有说明。
InstallShield X制作安装程序杂记(6.Server Configuration节点)
1.Internet Information Services(IIS配置):主要是给Web项目制作使用的。
这里有一个根IIS Configuration,右键->Add web side(建立web站点),建立站点时候,可以在站点上面建立虚拟目录(New Virtual Directory)。右边的Key-Value表中有很多条目,只要你会设置IIS,这些都是小菜了。
2.SQL Servers(MS SQL Server配置):用于SQL Server的配置,我看了一下,好像可以通过SQL脚本(script)在安装时建库,建表等。一言以蔽之,可以作为数据库的初始化。
在根节点SQL Servers上,右键->new SQL Connection,填写相应数据即可。
--这个大节点,我没有实际测试,不过比较简单,属于一看就明白的,就不一一翻译了,有问题单独交流。
InstallShield X制作安装程序杂记(5.System Configuration节点)
1.Shortcuts(快捷方式):快捷方式主要是以下几个地方:
Start Menu(开始菜单)/Programs Menu(程序菜单)/Startup(启动)/Desktop(桌面)
(1)Start Menu,如果你装了UtraEdit就知道了,点击开始菜单,在上方就可以看到,这是比较cool的一种方式,堪称最快捷。而且很多软件都不往那里装,比较显眼,好找。
(2)Programs Menu,是大多数软件都采用的快捷方式位置,即在开始->程序中所列出。
(3)Startup,如果你的软件希望用户开机就运行,可以在这里建立,位于开始->程序->启动。
(4)Desktop,在桌面创建快捷方式。
几种快捷方式的配置方式都一样,在相应节点上点击右键,有一个New Shortcut(但我这里不知道什么原因该项无效),我使用的是New Advertised Shortcut,建立以后,右边会出现一个Key-Value表项,这里挑几个说说。
Display Name:快捷方式的名称。
Target:这里写快捷方式指向的文件名,对应快捷方式中的“目标”。比如<TARGETDIR>binpmain.exe
Arguments:参数。比如主程序的运行参数是pmain -start,那这里就填写-start。
Working Directory:对应快捷方式中的“起始位置”,比较重要,如果不设置,而程序中使用GetCurrentPath可能获得的是快捷方式所在的位置(如桌面,而不是目标所在目录),从而导致程序路径错误。对应上面的Target,这里应该填写 <TARGETDIR>bin。
2.Registry(注册表):可以把一些信息写入注册表。这个节点的工作区布局,和上篇所说的Files and Folders很相似,上面是源(Recource),下面是目的(Destination),如果要复制注册表项名称,用法很简单,在Source computer’s Registery view中选定要修改的注册表项,按紧鼠标,拖拽到Destination computer’s Registry中的相应节点中就可以;如果要新建表项,在Destination computer’s Registry节点中点击右键,new->Key,如果要指定key值,使用相应的菜单项,跟在注册表中直接操作差不多,这里就不多说了。
----以下几个节点在MSI Project中有,InstallScript Project中却没有。关于××× Project,我一直很困惑,我到时专门写一个文章,提出我的困惑。
3.ODBC Resources(ODBC 源)
4.INI File Changes(ini文件更改)
5.Environment Variables(环境变量)
这几个节点的配置很简单,我就不说了。
InstallShield X制作安装程序杂记(4.Application Data节点)
1.Files and Folders(文件与文件夹):这个一看就明白,有四个区域Source computer’s folders(源机器文件夹,即制作安装程序的机器中的文件夹),Source Computer’s files(源文件,列出源文件夹中的文件)
Destination computer’s folders(目标机器文件夹,即要安装的机器上的文件夹),Destination computer’s files(目标文件)。
(1) 前两个,跟资源管理器没多大区别,重点说说Destination computer’s folder,这里一般会列出[AppDataFolder],[Common FilesFolder],[INSTALLDIR],如果需要其他文件夹,可以通过在根节点Destination Computer上点击右键->Show Predifined Folder来选择,这样就可以把文件安装到相应的系统预定义文件夹中。
(2) 对于一般的安装制作,用最后一个就可以。方法:在Source computer’s folders中选定源文件夹,按紧鼠标,拖拽到[INSTALLDIR]节点下面,拖拽过来时,会弹出一个对话框,询问你是否要使用动态文件链接,我建议采用动态文件链接,这样,如果源文件发生了变化,都可以在编译时自动更新。接下来还会出现一个对话框,可以设定是否包含子目录(Include subfolders),是否自动注册所有的文件(Self-Register all files)等,一般说来,按Y,然后按一个OK就可以了。
(3) 如果要指定目的文件夹的读写权限,通过右键->Properties->Permissions来进行设置。
(4)一旦加入了文件夹,InstallshieldX就自动建立了一个Component,上一篇中已经说明了Component和Feature的关系。所以这里,特别要注意的是,要看清楚最上面的那一行字“Add new components to the feature”后面的下拉框,(2)中的文件,将和指定的Feature相关联,如果这里指定得不对,假如用户没有选定这个Feature,那这些文件就不会安装到指定的目录。
2.Redistributables: 直译是‘重新分配表’,我理解的就是安装所需要的一些附带包,可以翻译为‘分发包’点击就可以看到一个列表,把需要的包打勾就可以。
InstallShield X制作安装程序杂记(3.Orgnization节点)
(一)Setup Design 安装设计,这个节点实际是Features和Components的一个树结构
(二)Features 这个节点很重要。不知怎么翻译比较好,暂且叫‘安装部分’比如你的软件有几个部分,可以由用户选择安装,就需要在这里分别设置。各个Features之间可以有依赖关系,一个Features可以包括多个Components。(通过new Component就可以建立。) 从用户角度来看,这是产品的最小组成部分。
(三)Components 安装零件。可以是文件、快捷方式、注册表项等。多个Components组成一个Feature,从制作者角度来看,是安装程序的最小组成部分。
(四)Setup Types 安装类型。可以在这里维护安装类型,比如添加一个‘完整安装’,‘自定义安装’,‘最小安装’等。这个节点很简单,点击每个安装类型,可以选择相应的Feature,右边可以设置显示和描述的文字。
InstallShield X制作安装程序杂记(2.Installation Information节点)
Installation Information,即安装信息。
(一).General Information:
1. Project Properties,
Author Name中填写作者姓名;Setup Languages,下面会列出一个语言列表,你可以根据需要进行勾选,InstallShield X默认的语言是English,如果你只要简体中文的话,需要先选中Chinese(Simplified),然后把在‘String Tables’下把Chinese(Simplified)设置为默认(点击右键,Make Default),再把English从列表中去掉。如果选择了多种语言,安装时会出现语言选择对话框。
PlatForms 选择这个安装程序可以在哪些操作系统中进行安装。
2.Add or Remove Programs:这栏信息与控制面板->添加/删除程序相关
Display Icon:选择在‘添加/删除程序’列表中显示的图标
Disable Change Button 是否让‘添加/删除程序’列表中的‘更改’按钮是否无效,默认为NO,即不Disable,有效。
Disable Remove Button 是否让‘添加/删除程序’列表中的‘删除’按钮是否无效,默认为NO,即不Disable,有效。
Publisher/Product URL 发行商/产品 网址
Read Me 可以填写readme文件名。
。。。接下来的几个都是类似的信息,不再一一列出,这些信息,将在‘添加/删除程序’列表中点击‘支持’信息弹出的对话框中出现。
3.Product Properties 产品属性
这个很简单,挑几个重要的说说:
TARGETDIR 目标文件夹。比如
<FOLDER_APPLICATIONS><IFX_COMPANY_NAME><IFX_PRODUCT_NAME> 这几个括号中的是变量。分别代表应用 程序文件夹公司名称产品名称,你也可以修改这个值,如去掉公司名称变量。
Executable File 主程序名称
Application Type 应用程序类型 我选的是Standard Windows Application 。这个值有对安装有什么影响,还没有试验。
4.String Tables 字串表。
点击下面的Chinese(Simplified)节点,可以看到字符定义表,这些变量,可能影响你安装的显示。你可以进行相应的修改、添加。
(二)Update Service更新服务 如果选了Enable Update Service为True,可以设置Host(主机)/Update Check Interval(更新检查间隔时间)等来配置更新服务。这个功能,由于我还没有加以试验。先不多说,以后再补充。
InstallShield X制作安装程序杂记(1.视图概貌)
把视图篇写在首位,主要是我当时在看帮助的时候,看到很多诸如installscript view,dialog view之类的字眼,可我在面板上不能很快的找到,好像这帮助写的不是这个版本似的,这让我感觉很郁闷。而后来发现,这还是和不熟悉有很大关系。废话少说,咱们先来看看视图。
打开菜单View,第三个菜单项为View Bar,点击之后,在窗口左边会出现一个视图列表条,分Installshield,View list steps和Workspace三栏,Installshield栏中主要是一些简介、帮助信息,不必多看。View list steps里面即是installation Designer中的一级视图导航。Workspace栏,这正是关键所在。我所疑惑的帮助中所说的view,指的就是这里,这里列出了常用的二级视图。请记住:View Bar
另外一个重要的视图是Project Assistant(工程助理视图),在Workspace栏中有入口,但是可能出现你点击了那个按钮,却没有任何反应的情况,是为什么呢,原来问题还在View菜单,看最后一个菜单项Project Assistant,把它选中就可以了。
主工作区,有几个切换页(Start page/Project Assistant/Installation Designer)Start Page是可以不用看,其中Installation Designer是最主要的工作视图。
本篇主要给新手刚进入系统进行环境熟悉,具体视图的内容,将在后面的文章进行介绍。
InstallShield X制作安装程序杂记(前言)
公司要做一个应用软件产品包装,产品本身的质量,实在是不好意思说什么,那就不说了。我的任务就是要把这个产品包装得大气一点。软件的安装程序制作,有很多工具可以使用,但头儿指定了InstallShield X,那咱就硬着头皮上吧!(以下简称X)
X的安装,一看就与众不同,蓝色的背景,感觉很新颖。对于这个新版的安装制作工具,对我还是有很大的吸引力的。而正因为是‘新版本’,其组织结构和以前的版本有很大不同,所以可查的资料很少,无论是英文还是中文。当时只有http://blog.joycode.com/hopeq/archive/2004/08/02/29325.aspx
上有一点比较简单的介绍,所以主要还得靠自己了,经过大概一周的努力,遇到不少问题,总算是把一个比较常见的完整安装过程完成了。写下这些东西的目的,不光是给自己记录,还可以给像我当时那样的新手以一定的参考。文章组织也许不是很有逻辑性,所以叫‘杂记’,只要能给别人有一点用处,不至于误导,我心足矣。如果有不正确的地方,还请大家指出。
说明:本人的安装工程是ScriptInstallProject,所以文中的视图、功能项均以ScriptInstallProject为准。
前天玩了一趟过山车,爽呆了,不过爽过了,由于速度太快,一时间没接受的了,脑部充血了,弄得头皮疼得要命,一碰就像针扎的似的,好难受啊.
![]()
今天感觉好多了,头顶不疼了,可是耳朵后面还是刺痛,慢慢恢复中……
偶感冒了,好难受啊,还有好多工作没做完呢,
IS12已经装上了,但是没发觉比IS10.5多了哪些功能,慢慢研究中! ![]()
最近这几天,系统做完了,优化也做好了,剩下的工作就是打包了,在网上找了好多制作安装软件的工具,setupFactory,Advanced Installer ,Wise Installation System ,可惜都不理想,关键的问题是不能在IIS中建立虚拟站点,还有将安装中的变量写入到指定的文件中,看来还是技术不到位啊,继续研究中……
![]()
最终选择使用InstalShiel10.5英文版.
通过几天的研究,现在已经初步的解决了问题,建立虚拟目录,不过还有一个问题,通过IS建立的虚拟目录,默认用户没有NETWORK,而且没有启用父路径.
通过对话框获得的用户变量不能写入到ASP文件中,这仍然是个问题.
经过一天的研究,终于成功了,关键在CHRB()和CHR()的用法上,我都做了注释,各位拿了去自己研究研究吧.
另外我这还有VB版的,可以生成DLL然后与ASP结合使用,需要的朋友留个声儿,说一下.
‘================================================
‘Edit by jena.want at 2006-09-07
‘=============http:www.ishere.cn=================
‘================================================
Dim sBASE_64_CHARACTERS
sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
sBASE_64_CHARACTERS = strUnicode2Ansi(sBASE_64_CHARACTERS)
Private Function strUnicode2Ansi(asContents)
‘convert unicode string to ansi string
strUnicode2Ansi = ""
len1 = Len(asContents)
For i = 1 To len1
VarChar = Mid(asContents, i, 1)
varasc = Asc(VarChar)
If varasc < 0 Then varasc = varasc + 65536
If varasc > 255 Then
varHex = Hex(varasc)
varlow = Left(varHex, 2)
varhigh = Right(varHex, 2)
strUnicode2Ansi = strUnicode2Ansi & ChrB("&H" & varlow) & ChrB("&H" & varhigh)
Else
strUnicode2Ansi = strUnicode2Ansi & ChrB(varasc)
End If
Next
End Function
Private Function strAnsi2Unicode(asContents)
‘convert ansi string to unicode string
strAnsi2Unicode = ""
len1 = LenB(asContents)
If len1 = 0 Then Exit Function
For i = 1 To len1
VarChar = MidB(asContents, i, 1)
varasc = AscB(VarChar)
If varasc > 127 Then
strAnsi2Unicode = strAnsi2Unicode & Chr(AscW(MidB(asContents, i + 1, 1) & VarChar))
i = i + 1
Else
strAnsi2Unicode = strAnsi2Unicode & Chr(varasc)
End If
Next
End Function
Public Function EncryptText(asContents)
‘let the ansicode string put up coding with base64bit
Dim lnPosition
Dim lsResult
Dim Char1
Dim Char2
Dim Char3
Dim Char4
Dim Byte1
Dim Byte2
Dim Byte3
Dim SaveBits1
Dim SaveBits2
Dim lsGroupBinary
Dim lsGroup64
Dim M4, len1, len2
len1 = LenB(asContents)
If len1 < 1 Then
EncryptText = ""
Exit Function
End If
M3 = len1 Mod 3
‘If M3 > 0 Then asContents = asContents & String(3 – M3, Chrb(0))
‘Don’t use Chrb() In Ansicode format case , use chr() , and convert to Ansicode format later .2006-09-08 jena.want
If M3 > 0 Then asContents = asContents & strUnicode2Ansi(String(3 – M3, Chr(0)))
‘complement digit easy to count
If M3 > 0 Then
len1 = len1 + (3 – M3)
len2 = len1 – 3
Else
len2 = len1
End If
lsResult = ""
For lnPosition = 1 To len2 Step 3
lsGroup64 = ""
lsGroupBinary = MidB(asContents, lnPosition, 3)
Byte1 = AscB(MidB(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 And 3
Byte2 = AscB(MidB(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 And 15
Byte3 = AscB(MidB(lsGroupBinary, 3, 1))
Char1 = MidB(sBASE_64_CHARACTERS, ((Byte1 And 252) 4) + 1, 1)
Char2 = MidB(sBASE_64_CHARACTERS, (((Byte2 And 240) 16) Or (SaveBits1 * 16) And &HFF) + 1, 1)
Char3 = MidB(sBASE_64_CHARACTERS, (((Byte3 And 192) 64) Or (SaveBits2 * 4) And &HFF) + 1, 1)
Char4 = MidB(sBASE_64_CHARACTERS, (Byte3 And 63) + 1, 1)
lsGroup64 = Char1 & Char2 & Char3 & Char4
lsResult = lsResult & lsGroup64
Next
‘dispose the last residual chars
If M3 > 0 Then
lsGroup64 = ""
lsGroupBinary = MidB(asContents, len2 + 1, 3)
Byte1 = AscB(MidB(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 And 3
Byte2 = AscB(MidB(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 And 15
Byte3 = AscB(MidB(lsGroupBinary, 3, 1))
Char1 = MidB(sBASE_64_CHARACTERS, ((Byte1 And 252) 4) + 1, 1)
Char2 = MidB(sBASE_64_CHARACTERS, (((Byte2 And 240) 16) Or (SaveBits1 * 16) And &HFF) + 1, 1)
Char3 = MidB(sBASE_64_CHARACTERS, (((Byte3 And 192) 64) Or (SaveBits2 * 4) And &HFF) + 1, 1)
If M3 = 1 Then
lsGroup64 = Char1 & Char2 & ChrB(61) & ChrB(61) ‘use "=" complement digit
Else
lsGroup64 = Char1 & Char2 & Char3 & ChrB(61) ‘use "=" complement digit
End If
lsResult = lsResult & lsGroup64
End If
‘convert ansicode format to unicode format and put out
EncryptText = strAnsi2Unicode(lsResult)
End Function
Public Function DecryptText(asContents)
‘let the base64bit format string convert to ansicode format
asContents = strUnicode2Ansi(asContents)
Dim lsResult
Dim lnPosition
Dim lsGroup64, lsGroupBinary
Dim Char1, Char2, Char3, Char4
Dim Byte1, Byte2, Byte3
Dim M4, len1, len2
len1 = LenB(asContents)
M4 = len1 Mod 4
‘the string’s length should be multiple with 4
If len1 < 1 Or M4 > 0 Then
DecryptText = ""
Exit Function
End If
‘judge the last bit is "=" or not
‘judge the reciprocal second bit is "=" or not
‘this "m4" means the count of chars where last residual width dispose by oneself
If MidB(asContents, len1, 1) = ChrB(61) Then M4 = 3
If MidB(asContents, len1 – 1, 1) = ChrB(61) Then M4 = 2
If M4 = 0 Then
len2 = len1
Else
len2 = len1 – 4
End If
For lnPosition = 1 To len2 Step 4
lsGroupBinary = ""
lsGroup64 = MidB(asContents, lnPosition, 4)
Char1 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 1, 1)) – 1
Char2 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 2, 1)) – 1
Char3 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 3, 1)) – 1
Char4 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 4, 1)) – 1
Byte1 = ChrB(((Char2 And 48) 16) Or (Char1 * 4) And &HFF)
Byte2 = lsGroupBinary & ChrB(((Char3 And 60) 4) Or (Char2 * 16) And &HFF)
Byte3 = ChrB((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))
lsGroupBinary = Byte1 & Byte2 & Byte3
lsResult = lsResult & lsGroupBinary
Next
‘dispose the last residual chars
If M4 > 0 Then
lsGroupBinary = ""
lsGroup64 = MidB(asContents, len2 + 1, M4) & ChrB(65) ‘chr(65)=A convert to value is 0
If M4 = 2 Then ‘complement digit to 4 for easy to count
lsGroup64 = lsGroup64 & ChrB(65)
End If
Char1 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 1, 1)) – 1
Char2 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 2, 1)) – 1
Char3 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 3, 1)) – 1
Char4 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 4, 1)) – 1
Byte1 = ChrB(((Char2 And 48) 16) Or (Char1 * 4) And &HFF)
Byte2 = lsGroupBinary & ChrB(((Char3 And 60) 4) Or (Char2 * 16) And &HFF)
Byte3 = ChrB((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))
If M4 = 2 Then
lsGroupBinary = Byte1
ElseIf M4 = 3 Then
lsGroupBinary = Byte1 & Byte2
End If
lsResult = lsResult & lsGroupBinary
End If
DecryptText = strAnsi2Unicode(lsResult)
End Function