KIANO'S WORKSHOP
日历
天气
网志分类
· 所有网志
最新的评论
站内搜索
友情链接
· 歪酷博客
· 管理博客
· 崽崽

订阅 RSS

0003833

歪酷博客

powered by KIANO 联系方式:广交朋友,四海为家 M:13485003996 官网:www.mixzine.cn
储伟杰 @ 2008-02-15 19:33

2007-11-15 14:41
   


[Code]
procedure URLLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;

begin
ShellExec('open', ' http://bbs.exetool.com ', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;                       (链接网址)

function mciSendString(lpszCommand: String; lpszReturnString: Integer; cchReturnLength: Integer; hwndCallback: Integer): Integer;
external 'mciSendStringA@winmm.dll stdcall';

procedure InitializeWizard();
var
SplashImage: TBitmapImage;
SplashForm: TForm;
SplashFileName: String;
I : Integer;
URLLabel: TNewStaticText;
CancelButton: TButton;

begin

WizardForm.WELCOMELABEL1.Font.Color:= clRed;
WizardForm.WELCOMELABEL1.Font.Name:= '宋体';
WizardForm.WELCOMELABEL1.Font.Size:= 11;
CancelButton := WizardForm.CancelButton;
ExtractTemporaryFile(ExtractFileName(ExpandConstant('{tmp}\dream.mid')));
mciSendString(ExpandConstant('play {tmp}\dream.mid'),0,0,0);
 (背景音乐)

URLLabel := TNewStaticText.Create(WizardForm);
URLLabel.Top := CancelButton.Top;
URLLabel.Left := WizardForm.Width - CancelButton.Left - CancelButton.Width;
URLLabel.Caption := '  软件本地化团队'; (左下角的链接文字)
URLLabel.Font.Color := clBlue;
URLLabel.Cursor := crHand;
URLLabel.OnClick := @URLLabelOnClick;
URLLabel.Parent := WizardForm;
SplashFileName := ExpandConstant('{tmp}\RAR_Splash.bmp');
ExtractTemporaryFile(ExtractFileName(SplashFileName));

SplashForm := TForm.create(nil);
with SplashForm do
begin
BorderStyle := bsNone;
Position := poScreenCenter;
ClientWidth := 354;     (闪屏宽)
ClientHeight := 180; (闪屏宽)
end;

SplashImage := TBitmapImage.Create(SplashForm);
with SplashImage do
begin
Bitmap.LoadFromFile(SplashFileName);
Stretch := true;
Align := alClient;
Parent := SplashForm;
end;

with SplashForm do
begin
Show;
for I := 1 to 2 do
begin
Repaint;
Sleep(1000);
end;
Close;
Free;
end;
end;


 
储伟杰 @ 2008-02-15 19:32

1、认识脚本的格式:(详细说明可查阅Inno Setup 的帮助文档)
Inno Setup的安装脚本包含以下主要段落:

[Setup] 段:安装和卸载程序的全局设置,如作者信息、安装目录、压缩方式、是否卸载等。
[Types] 段:定义安装组件的类型,如“完全安装”、“最小安装”、“选择安装”。
[Components] 段:定义可供选择安装的所有组件
[Tasks] 段:定义安装期间所有由用户定制的任务。
[Dirs] 段:定义用户想额外创建的目录。
[Files] 段:定义要打包到安装程序里的文件。
[Icons] 段:定义要创建在开始菜单、桌面或任务栏等位置的快捷方式和图标。
[INI] 段:定义向用户系统中 .INI 文件中添加的新条目。
[InstallDelete] 段:定义要在安装之前删除的文件或文件夹。
[Languages] 段:定义安装程序中可使用的语言(适用于多国语言版)。
[Registry] 段:定义安装过程中要读取、新建或删除的注册表项。
[Run] 段:定义要在安装结束时运行的程序。
[UninstallDelete] 段:定义要在卸载时删除的其他文件或文件夹。
[UninstallRun] 段:定义要在开始卸载前运行的程序。

以上每个段落里都有若干具体条目对安装程序的处理功能进行详细设置,当然,并不是每一项都用得上,还得根据实际需要选择使用。

2、脚本范例分析:
先来看看一段用INNO SETUP脚本向导创建的基本脚本的[Setup]段:

[Setup]
AppName=Premiere 6.5 汉化补丁-----------------(程序名称)
AppVerName=Premiere 6.5 汉化补丁------------(程序名称+版本)
AppPublisher=浩子工作室----------------------------(开发单位或作者)
AppPublisherURL=http://www.haozi.com------(开发单位或作者网址)
AppSupportURL=http://www.haozi.com-------(技术服务网址)
AppUpdatesURL=http://www.haozi.com-------(更新升级网址)
DefaultDirName={pf}\Adobe\Premiere 6.5-----(默认安装路径,{pf}就是“Program files”文件夹)
DefaultGroupName=Premiere 6.5 汉化补丁----(默认添加在开始菜单中的项目名称)
AllowNoIcons=yes--------------------------------------(创建快捷方式图标)
LicenseFile=D:\汉化\许可文件.txt------------------(显示许可协议)
InfoBeforeFile=D:\汉化\汉化说明.txt-------------(显示软件说明)
OutputDir=成品-----------------------------------------(安装程序存放位置)
OutputBaseFilename=Premiere 6.5 汉化补丁--(安装程序名称)
SetupIconFile=汉.ico----------------------------------(安装程序图标)
Compression=lzma-------------------------------------(压缩器:Lzma)
SolidCompression=yes--------------------------------(压缩方式:一次性压缩)

括号里内容是笔者添加的注释,我想大家应该能够理解。不过,作为汉化补丁,一般不需要创建开始菜单项目,不需要创建快捷方式图标,不需要卸载功能,而要求具有自动寻找原程序安装位置的功能,这样可使补丁安装更方便快捷, 因此作了如下修改:
(1)去掉以下项目:
DefaultGroupName=Premiere 6.5 汉化补丁----(默认添加在开始菜单中的项目名称)
AllowNoIcons=yes--------------------------------(创建快捷方式图标)
(2)增加以下项目:
DisableDirPage=yes-------------------------------(不用指定安装路径)
DisableProgramGroupPage=yes---------------(不要添加开始菜单项目)
DirExistsWarning=no-----------------------------(不提示文件夹已存在)
Uninstallable=no-----------------------------------(不要卸载程序)
(3)修改以下项目:
原来的:
DefaultDirName={pf}\Adobe\Premiere 6.5----(默认安装路径,{pf}就是“Program files”文件夹)关键问题是,这个路径是死的,一旦你在安装Premiere 6.5时更改了安装路径,比如有些人喜欢把大程序安装到D盘,这么一来,原路径就无效了,结果您还得手动指定正确的路径。这样的安装程序就显得太“笨”了。那么,如何让补丁程序自动获得原程序的实际安装路径呢?回答是:利用注册表。
大多数应用程序安装后都会向注册表的特定位置写入安装和卸载信息,因此,只要让安装程序提取这些信息并转位自己的安装路径,就可实现自动定位功能。Inno Setup早就支持这个功能了,现在,我们把Premiere 6.5的注册表信息告诉它就行了,请看修改后的:
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Premiere 6.5,InstallLocation}-------------(从注册表读取Premiere 6.5的实际安装路径)

接着来看看基本脚本的[Files]段, 前面讲过,这一段是用来定义要打包到安装程序里的文件的, 因此, 要搞清楚这几个名词:

Source:-------------文件的存放位置(来源)
DestDir:-------------文件要安装到什么地方(目标)
Flags:----------------对文件的附加处理参数(标示)

下面来看看具体内容:

[Files]
Source: "D:\汉化\Preminfo.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\汉化\主程序\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\汉化\插件\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

生词注释:
{app}----------------这是个常量, 代表程序安装路径,只要你在[Setup]段中的DefaultDirName项中进行了设定,其他地方就可以用它来代替。可能有人会问,常量是什么?通俗地说就是固定词汇,它们用简单的符号分别代表操作系统中的一些固定目录,使脚本简洁明了。具体内容可参看Inno Setup的帮助文本里的相关说明。
Ignoreversion--------不理会文件的版本问题。
Recursesubdirs-------把主文件夹和子文件夹一块儿打包(一锅端)。
Createallsubdirs-----安装时创建相应的子文件夹。
对[Files]段的修改:很多汉化补丁都是直接用汉化过的文件去替换原文件,很少在原程序目录里创建新的文件夹,因此可以去掉 Flags 标示中的 Createallsubdirs 项。
最后来看看修改后的脚本:
[Setup]
AppName=Premiere 6.5 汉化补丁
AppVerName=Premiere 6.5 汉化补丁
AppPublisher=浩子工作室
AppPublisherURL=http://www.haozi.com
AppSupportURL=http://www.haozi.com
AppUpdatesURL=http://www.haozi.com
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Premiere 6.5,InstallLocation}
DisableDirPage=yes
DisableProgramGroupPage=yes
DirExistsWarning=no
Uninstallable=no
LicenseFile=D:\汉化\许可文件.txt
InfoBeforeFile=D:\汉化\汉化说明.txt
OutputDir=成品
OutputBaseFilename=Premiere 6.5 汉化补丁
SetupIconFile=汉.ico
Compression=lzma
SolidCompression=yes

[Files]
Source: "D:\汉化\Preminfo.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\汉化\主程序\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
Source: "D:\汉化\插件\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs


 
储伟杰 @ 2008-02-15 19:30

目录常量

{app}
应用程序目录,这是用户在安装向导的选择安装目录页里面所选择的。
例如:如果你使用了 {app}\MYPROG.EXE 作为一项并且用户选择了“C:\MYPROG”作为应用程序的目录,那么安装程序就会将它转换成“C:\MYPROG\MYPROG.EXE”
{win}
系统的 Windows 目录。 例如:如果你使用了 {win}\MYPROG.INI 作为一项并且系统的 Windows 目录是“C:\WINDOWS”,那么安装程序就会将它转换成“C:\WINDOWS\MYPROG.INI”
{sys}
系统的 Windows 系统(System)目录(在 Windows NT/2000 下是 System32)。 例如:如果你使用了 {sys}\CTL3D32.DLL 作为一项并且系统的 Windows 系统目录是“C:\WINDOWS\SYSTEM”,那么安装程序就会将它转换成“C:\WINDOWS\SYSTEM\CTL3D32.DLL”
{src}
这个文件夹指向安装程序所在的位置。
例如:如果你使用了 {src}\MYPROG.EXE 作为一项并且用户是从“S:\ ”安装的,那么安装程序就会将它转换成“S:\MYPROG.EXE”
{sd}
系统驱动器,它是指 Windows 被安装到的那个驱动器,典型的是“C:”,对于 Windows NT/2000,这个常量同系统的环境变量“SystemDrive”是等效的。
{pf}
程序文件夹(Program Files),这个路径是系统的 Program Files 目录,典型的是“C:\Program Files”
{cf}
公共文件夹(Common Files),这个路径是系统的 Common Files 文件夹,典型的是“C:\Program Files\Common Files”
{tmp}
临时目录,这个目录并不是用户的 TEMP 环境变量指向的目录,而是安装程序在启动时在用户的临时目录下建立的一个子目录(它有一个类似于
C:\WINDOWS\TEMP\IS-xxxxx.tmp”
这样的名字),在安装程序退出时所有的文件和子目录将会被删除。对于在 [Run] 段里面要被执行且在安装以后又不需要的程序文件来说这个功能是非常有用的。
{fonts}
字体目录,在 Windows 95/NT 4+ 下有一个专门为字体设立的目录(通常这个目录在 Windows 目录下且被命名为“FONTS”),这个常量就指向这个目录。对于 Windows NT 3.51,这个常量是和 {sys} 等效的,因为当时还没有字体目录。
{dao}
DAO
目录,当安装程序运行在 Windows 95/NT 4+ 上时,它被等效为 {
cf}\Microsoft Shared\DAO
,当运行于 Windows NT 3.51 时,它被等效为 {
win}\MSAPPS\DAO.
外壳(Shell)文件夹常量

Inno Setup
还支持另外一套目录常量,这就是涉及到的外壳(shell)文件夹常量,它们具有和其它的目录常量相同的使用方法。然而,如果在脚本的 [Setup] 段里面放入了 MinVersion=4,3.51 这一行来表示允许支持 NT 3.51,那么将只有 {group} 这个外壳文件夹常量能被使用,并签只能用在 [Icons] 段。

下面的包含了“user”的常量涉及到当前登陆的用户私人文档(profile),而带有
common”
的常量会涉及到全部用户(All Users)的私人文档(profile)。当安装程序运行在 Windows NT/2000 操作系统下并且用户不具有管理员的权限时,所有的带有“common”的常量会强迫同带有“user”的常量等效。

*
标记表示带有“common”的常量在 Windows 9x 操作系统下同带有“user”的常量等效。

{group}
程序组的路径,取决于用户在安装程序向导的选择程序组页的选择。对于 Windows NT,这个文件夹始终被建立在所有用户的私人文档(All Users profile),除非用户正在安装的这个应用程序不具有管理员的权限,那么在这种情况下它将被建立在用户的私人文档中(profile.
{sendto}
当前用户的发送的路径。(没有公共的发送文件夹。)
{userappdata} & {commonappdata}
应用程序数据(Application Data)文件夹的路径。
{userdesktop} & {commondesktop} *
桌面文件夹的路径,推荐桌面快捷方式使用 {userdesktop}.
{userdocs} & {commondocs}
我的文档文件夹的路径(或者对于 NT 4.0,是指私人文件夹).
{userfavorites} & {commonfavorites}
收藏夹的路径,这个常量的使用方法是需要 MinVersion 的设置至少为“4.1, 4”,目前只有 Windows 2000 支持 {commonfavorites},如果使用的是在这之前的版本的 Windows,那么它将会被转换成和{userfavorites} 相同的目录。
{userprograms} & {commonprograms} *
在开始菜单里面的程序文件夹的路径。
{userstartmenu} & {commonstartmenu} *
开始菜单的定级路径。
{userstartup} & {commonstartup} *
开始菜单里面的启动文件夹的路径。
{usertemplates} & {commontemplates}
模板(Templates)文件夹的路径,目前只有 Windows 2000 支持 {
commontemplates}
,如果使用的是在这之前的版本的 Windows ,它将会被转换成和 {usertemplates} 相同的目录。
其他的常量

{\}
一个反斜杠字符,请参见本页前面提到的关于常量 {\} 和单字符 \ 在使用上有何不同的说明。
{%NAME}
内嵌一个环境变量,这个 NAME 是要使用的环境变量的名字。如果在用户的系统当中指定的环境变量不存在,这个常量就会被一个空的字符串所替代。
{computername}
安装程序正在运行的计算机的名称(就是“GetComputerName”函数的返回值)。
{groupname}
用户在安装程序向导的选择程序组页选择的程序组的名称,这个是不同于 {group} 的,它不包括路径。
{hwnd}
(专门用途)传送安装程序背景窗口的窗口句柄。
{reg:HKxx\SubkeyName,ValueName|DefaultValue}
内嵌一个注册表值。
HKxx
指定根键(root key),参见 [Registry] 文档所列出的根键。
SubkeyName
指定要读取的子键的名称。
ValueName
指定要读取的值的名称,要读取一个键的默认值就让 ValueName 为空。
DefaultValue
如果指定的注册表值不存在或者它不是一个字符串类型(REG_SZ 或者 REG_EXPAND_SZ),则嵌入这个值。
如果你希望包括一个逗号,竖线(字符“|”)或大括号闭弧“}”在常量里面,你必须通过“%-编码形式用“%”后紧跟一个两位的16进制代码转译后替换原来的字符,一个逗号是“%2c”,一个竖线符是“%7c”,一个大括号闭弧是“%7d”
DefaultValue
可以包括常量,然而,如上所诉内嵌的常量的大括号的闭弧
“}” 必须被改成“%7d”才可以。
{srcexe}
安装程序的文件名全称(包括全程路径和文件名),例如“C:\SETUP.EXE”
{username}
运行安装程序的用户的名称(函数 GetUserName 的返回值)。



 
储伟杰 @ 2008-02-15 19:27

[Setup]: Bits
有效值: 32

说明:
1.3 版本以后已废弃。 1.3 以前的版本的 Inno Setup 有一个 16 位的版本,编译器将检查 Bits 关键字以判断是否使用了正确的编译器来编译脚本。以后 Inno Setup 的更新的版本只有 32 位的版本可用,你将不再需要设置该关键字。无论什么时候如果 Bits 被设置为“16”,编译器都将会失败并提示一个错误消息。
[Setup]: UseSetupLdr
有效值: yes 或 no
默认值: yes

说明:
告诉安装程序编译器要创建的安装程序的类型,如果是 yes, 将把所有的安装程序数据编译成一个单独的 SETUP.EXE (如果你愿意也可以重新命名为任何名称)。如果是 no, 将把安装程序数据编译成至少三个文件:SETUP.EXE, SETUP.0 和 SETUP.1. 你想使用 no 的仅有的理由大概是为了调试的目的。

注意:不要在一个使用了多磁盘生成(DiskSpanning=yes)的安装程序中使用 UseSetupLdr=no,当 UseSetupLdr 是 yes 时,安装程序被复制到用户的临时 (TEMP) 目录并在那里运行,这不会发生在 UseSetupLdr 是 no 的情况下,如果 Windows 试图去在磁盘上寻找 setup.exe 文件却不能找到,因为在驱动器中的是一个不同的磁盘,所以会产生错误的结果。

[Setup]: BackColor, BackColor2
有效值: 一个值形如 $bbggrr, 这里的 rr, gg 和 bb 指定了两位的亮度值(以十六进制表示)分别为红色,绿色和蓝色。或者也可以是下列预定义的颜色名称之一:clBlack(黑色),clMaroon(暗红),clGreen(绿色),clOlive(橄榄绿),clNavy(深蓝),clPurple(紫色),clTeal(深青),clGray(灰色),clSilver(浅灰),clRed(红色),clLime(浅绿),clYellow(黄色),clBlue(蓝色),clFuchsia(紫红),clAqua(青绿),clWhite(白色)。  
  
默认值: BackColor 为 clBlue,
BackColor2 为 clBlack  

说明:
BackColor 关键字自定的颜色被用在安装程序窗口背景渐变色的上面(或左面,如果 BackColorDirection=lefttoright),BackColor2 指定的颜色被用在下面(或右面)。

如果 BackSolid=yes 则 BackColor2 的设置被忽略。

示例:

BackColor=clBlue
BackColor2=clBlack
BackColor=$FF0000
BackColor2={post.abstract}0000

[Setup]: BackColorDirection
有效值: toptobottom 或 lefttoright
默认值: toptobottom

说明:
决定了安装程序窗口的背景渐变色的渐变方向,如果 BackColorDirection 是 toptobottom, 将自上而下绘出,如果是 lefttoright, 将从左到右绘出。

[Setup]: BackSolid
有效值: yes 或 no
默认值: no

说明:
它决定了安装程序窗口的背景色是使用单一颜色还是渐变色,如果是 yes, 背景色会是一单一颜色(颜色由 BackColor 指定,忽略 BackColor2)。

[Setup]: AppName
说明:
这个必需的关键字指定了你正在安装的应用程序的标题。不要包含版本号,那样应该使用 AppVerName 关键字。AppName 在安装程序的全部过程始终被显示,位于安装程序屏幕的左上角和向导中。
示例: AppName=My Program

[Setup]: AppVerName
说明:
这个必需的关键字的值应该和 AppName 的值相同(或相似),但是它还应当包含程序的版本号。
示例: AppVerName=My Program version 3.0

[Setup]: AppId
默认值: 如果没有指定 AppId 或者它是空值,编译器将会把 AppName 的值作为 AppId 来使用。

说明:
AppId 的值是被存储在卸载记录文件 (unins???.dat) 里面的,以便随后的安装程序检查后决定是否可以被添加到一个特定的已存在的卸载记录,安装程序只有在已存在的卸载记录中的 AppId 和当前的安装程序的 AppId 相同是才能添加到卸载记录。举一个实际的例子,比方说你右两个安装程序,一个叫做《我的程序》而另外一个叫做《我的程序 1.1 升级版》,要想把《我的程序 1.1 升级版》添加到《我的程序》的卸载记录中,你应该设置两个安装程序的 AppId 为相同的值。

AppId 还决定了卸载注册表键的实际名称,被 Inno Setup 在其末尾附加上“_is1”(因此,如果 AppId 是 “MyProgram”,那么这个键将会被命名为“MyProgram_is1”)。Inno Setup 的早于 1.3 的版本的键的名称是基于 AppVerName 的值的。

无论什么时候 AppId 都不会被显示出来,因此你要求非常隐讳的感觉很轻松。

示例: AppId=MyProgram

[Setup]: AppMutex
说明:
如果用户要为当前的应用程序升级为新的版本,然而当前的应用程序正在运行,该关键字就是用来防止这类事情的发生的,而且它也可以防止用户卸载正在运行的应用程序。它指定了一个或多个同名互斥体的名称(多个互斥体用逗号隔开),安装程序和卸载程序将会在启动时检查,如果存在,安装程序/卸载程序将显示如下的信息:“[安装程序或卸载程序] 检测到 [应用程序] 现在正在运行。请立即关闭它的全部实例,然后单机‘确定’继续,或者‘取消’退出。”
如果你要使用这个关键字就必须在你的应用程序中以该关键字指定的名称添加一个同名的互斥体。例如在 Delphi 和 C 中创建如下显示的同名互斥体,该代码应该在应用程序启动是被执行。

Delphi:
CreateMutex(nil, False, ’MyProgramsMutexName’);

C:
CreateMutex(NULL, FALSE, "MyProgramsMutexName");

并不是必需在应用程序被结束之前显示的销毁同名互斥体对象,系统会自动完成此功能,也不推荐你这样做,因为理想状态下同名互斥体对象必须存在直到进程被完全终止。

注意在 Windows 下同名互斥体是大小写敏感的。

要想获得有关同名互斥体的更多信息请参阅 MS SDK 帮助的 CreateMutex 主题。

示例: AppMutex=MyProgramsMutexName

[Setup]: AppCopyright
说明:
可选的,它只是用来在安装程序屏幕的右下角显示一个版权消息。
示例: AppCopyright=Copyright ? 1997 My Company, Inc.

[Setup]: AppPublisher, AppPublisherURL, AppSupportURL, AppUpdatesURL, AppVersion
说明:
所有这些关键字都是用来在 Windows 2000 的控制面板“添加/删除程序”的“支持”对话框中显示一些信息。这些设置是可选的,并且在早期的 Windows 版本中是没有作用的。
示例:
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.mycompany.com/
AppVersion=1.5

[Setup]: DefaultDirName
说明:
这是个必需的关键字,该值是默认的目录名称,用于“选择目录页”向导。通常它有一个目录常量前缀。
如果 UsePreviousAppDir 是 yes (默认值)并且安装程序发现已经安装了一个相同应用程序的早期版本,它将用先前选择的目录代替默认的目录名称。

示例:

如果你使用:
DefaultDirName={sd}\MYPROG
在 Setup 中,典型地应有如下显示:
C:\MYPROG

如果你使用:
DefaultDirName={pf}\My Program
在 Setup 中,典型地应有如下显示:
C:\Program Files\My Program

[Setup]: Uninstallable
有效值: yes 或 no
默认值: yes

说明:
它决定了 Inno Setup 的自动卸载程序是否被包含在安装程序中。如果是 yes 将包含卸载程序,如果是 no 将不会包括可卸载支持,最终用户只能用手工的方法删除属于你的应用程序的文件。

[Setup]: MinVersion
格式: a.bb,c.dd, 这里的 a.bb 是表示 Windows 的版本,c.dd 是表示 Windows NT 的版本。
默认值: 4,4

说明:
该关键字让你指定运行你的软件所需要的最低的 Windows 或 Windows NT 的版本,默认值是“4,4”,实际上它也可以被设置为“4,3.51”来支持 NT 3.51 . 要防止你的程序被运行在 Windows 或 Windows NT 上,指定“0”为其中之一的最低版本。版本创建编号(Build numbers)和(或)服务包级别(Service pack levels)可以被包括在版本号中。

如果用户的系统不适合所要求的最低版本,安装程序将给出一个错误消息然后退出。

[Setup]: OnlyBelowVersion
格式: a.bb,c.dd, 这里的 a.bb 是表示 Windows 的版本,c.dd 是表示 Windows NT 的版本。
默认: 0,0

说明:
该关键字让你指定不能运行你的软件的最低的 Windows 或 Windows NT 的版本(亦即高于此版本则无法运行)。指定 0 为其中之一的版本的意思是没有版本上限。版本创建编号(Build numbers)和(或)服务包级别(service pack levels)可以被包括在版本号中。

该关键字实际上是和 MinVersion 恰好相反。

[Setup]: AdminPrivilegesRequired
有效值: yes 或 no
默认值: no

说明:
如果设置为 yes, 而且用户没有管理员的权限,那么安装程序在启动的时候将给出一个错误消息(“安装这个程序时你必须以管理员的身份登录。”)。它只适用于 Windows NT/2000.

[Setup]: DisableAppendDir
有效值: yes 或 no
默认值: no

说明:
当设置为 yes 时,安装程序不会自动的添加上次组件的路径从 DefaultDirName 到用户在“选择目录”向导页上双击鼠标选择的目录。此外,它设置目录列表框的初始目录为 DefaultDirName (如果该目录存在)而不是上一级。

[Setup]: EnableDirDoesntExistWarning
有效值: yes 或 no
默认值: no

说明:
当设置为 yes 时,如果用户选择的文件夹不存在安装程序将显示一个消息框。当这项为 yes 时通常你还应该设置 DirExistsWarning=no。

[Setup]: AlwaysCreateUninstallIcon
有效值: yes 或 no
默认值: no

说明:
如果该项为 yes, 除了在控制面板的添加/删除程序中添加一项之外安装程序还将创建一个 “卸载 ...” 应用程序图标。

在 NT 3.51 上安装程序将会始终创建这个应用程序图标不管该项的设置,因为它没有包含“添加/删除程序”的部件。

[Setup]: ExtraDiskSpaceRequired
默认值: 0
说明:
正常情况下,磁盘空间的需求是依照 [Files] 段中的所有文件的合计值计算出来并在向导中被显示的。如果不管什么原因你想要增加显示的磁盘空间,以字节为单位设置 ExtraDiskSpaceRequired 的数值你想要合计该数字。 (1048576 字节 = 1 兆字节)

[Setup]: CompressLevel
有效值: 0 到 9
默认值: 7

说明:
这是一个从 1 到 9 的数字,它指定了要给文件使用多大的压缩率,0 表示不压缩,9 表示最大限度的压缩。数字越大处理的就越慢,使用高于默认值 7 的数字来压缩并没有多大的改善。

[Setup]: CreateAppDir
有效值: yes 或 no
默认值: yes

说明:
如果该值设置位 no, 将不会创建应用程序的目录,也不会显示“选择目的文件夹”向导页,并且 {app} 目录常量会等效为 {win} 目录常量。当 CreateAppDir 是 no 时如果卸载功能是允许的,卸载数据文件将会被创建于系统的 Windows 目录。

[Setup]: CreateUninstallRegKey
有效值: yes 或 no
默认值: yes

说明:
如果该值设置为 no, 安装程序将不会在控制面板的“添加/删除程序”中创建一项。这个可以用于你的应用程序只是更新一个已经存在的应用程序而不想创建其它的项,但是请不要完全的禁止卸载功能(通过 Uninstallable=no)。

当这个关键字设置为 no 时,UpdateUninstallAppName 通常也设置为 no .

[Setup]: OverwriteUninstRegEntries
说明:
1.3 版本以后已废弃。该关键字已经不再被支持并且被忽略。在 Inno Setup 1.3.6 及以后的版本中,它的功能作为如果设置为 1 优先版本的 OverwriteUninstRegEntries 关键字(这是默认的设置)。
[Setup]: DirExistsWarning
有效值: auto, yes 或 no
默认值: auto

说明:
当设置为 auto 时,即默认的设置,如果用户在选择目标文件夹向导页中选择了一个已经存在的文件夹,安装程序将显示“文件夹: … 已经存在,以愿意将程序安装到这个文件夹下面吗?”的消息,除非有相同的应用程序的其它版本已经安装并且也选择了和上次安装时相同的目录(仅如果 UsePreviousAppDir 是 yes ,即默认设置)。

当设置为 yes 时,如果用户选择了已存在的目录安装程序将始终显示“目录已存在的消息”。

当设置为 no 时,安装程序决不会显示“目录已存在的消息”。

[Setup]: DisableDirExistsWarning
有效值: yes 或 no
默认值: no

说明:
到版本 1.3.6 时已经废弃。使用 DirExistsWarning 代替。

编译器仍然承认 DisableDirExistsWarning,但是如果 DisableDirExistsWarning=no 它将被转换成 DirExistsWarning=auto, 而且 DisableDirExistsWarning=yes 被转换成 DirExistsWarning=no. 如果同时指定了 DisableDirExistsWarning 和 DirExistsWarning 关键字,则优先处理 DirExistsWarning.

[Setup]: DisableDirPage
有效值: yes 或 no
默认值: no

说明:
如果该项设置为 yes, 安装程序将不会显示“选择目标文件夹”向导页。在这种情况下,它将始终使用默认的目录名。

[Setup]: DisableFinishedPage
有效值: yes 或 no
默认值: no

说明:
如果该项设置为 yes, 安装程序将不会显示“安装完成”向导页,并且在一次安装过程结束后会立即关闭安装程序。如果在 [Run] 段里面有一个要被执行的程序使用了 nowait 标记,并且你不希望在该程序被启动之候安装完成窗口还逗留在后台,此时该项是有用的。

注意安装程序认为要重新启动计算机,或如果指派了一个文件给 [Setup] 段的 InfoAfterFile 关键字,都将忽略 DisableFinishedPage 关键字。象这些情况,仍然会显示“安装完成”向导页。

[Setup]: DisableProgramGroupPage
有效值: yes 或 no
默认值: no

说明:
如果该项设置为 yes, 安装程序将不会显示“选择程序组”向导页。在这种情况下,它将使用由 [Setup] 段的 DefaultGroupName 关键字指定的组名,或者“(Default)”如果没有指定组名的话。

[Setup]: AlwaysUsePersonalGroup
有效值: yes 或 no
默认值: no

说明:
通常对于 Windows NT/2000, 如果用户具有管理员权限,Inno Setup 的 {group} 常量被指向全部用户(All Users)的开始菜单。如果该项被设置为 yes, 它将始终使用当前用户的私人文档(Profile)。

[Setup]: OutputBaseFilename
默认值: setup
说明:
这个关键字允许你为输出的安装程序文件指定一个不同的名字,这样一来你就不用在运行完安装编译器以后手工为它们改名。

注意:如果 UseSetupLdr 被设置为 no, 输出文件 SETUP.0 和 SETUP.MSG 的名字是不会被改变的,因为它们是强制编码(hard-coded)的名字。

示例: OutputBaseFilename=MyProg100

[Setup]: UninstallFilesDir
默认值: {app}
说明:
指定存放卸载程序文件“unins*.*”的目录。

注意:对于同一个应用程序的更新版本不应该将它赋一个不同的值,这样一来安装程序就不能在以前的版本中找到卸载记录,因此就不能添加到该应用程序。

示例: UninstallFilesDir={app}\uninst

[Setup]: UninstallDisplayIcon
说明:
让你指定一个确定的图标文件(可以是一个可执行文件或者一个 .ico 文件)来显示在 Windows 2000 控制面板的“添加删除程序”的卸载项当中,文件名通常以一个目录常量开始。
如果指定的文件包含多个图标,你可以加上“,n”后缀以指定一个图标索引,这里的 n 是以零为基数的索引数值。

如果没有指定该关键字或者该关键字为空,Windows 将自己选择一个图标,当然这个可能是你不太喜欢的图标。

示例:
UninstallDisplayIcon={app}\MyProg.exe
UninstallDisplayIcon={app}\MyProg.exe,1

[Setup]: UninstallDisplayName
说明:
让你为控制面板的“添加/删除程序”中的程序项指定一个制定的名字。如果未指定该关键字或该关键字为空,安装程序将使用 [Setup] 段中的 AppVerName 关键字的名字(就像老版本的 Inno Setup 一样)。
由于 Windows 9x 的控制面板的“添加/删除程序”项的限制,UninstallDisplayName 不能超过 63 个字符。

示例:
UninstallDisplayName=My Program

[Setup]: UninstallIconName
说明:
你能够使用该关键字给安装程序创建的卸载图标指定一个制定的名字(参见AlwaysCreateUninstallIcon)。如果该关键字为空或没有指定,安装程序将其命名为“卸载 App-Name”,这里的“App-Name”是由 [Setup] 段的关键字 AppName 指定的。
注意: 记住 Windows 95/NT 4+ 的应用程序图标是作为文件直接存储的,这样一来普通文件所不允许使用的字符都不能用来作为应用程序图标的名称。

示例: UninstallIconName=Uninstall My Program

[Setup]: UninstallLogMode
有效值: append, new 或 overwrite
默认值: append

说明:
append, 默认设置,如果可能,通知安装程序添加到一个已存在的卸载记录。

new, 同 Inno Setup 1.3 版本以前的版本的行为是一致的,通知安装程序始终创建一个新的卸载记录。

overwrite 通知安装程序要覆盖相同的应用程序的任何已存在的卸载记录而不是添加(这是不被推荐的)。相同的规则添加到已存在的记录应用于覆盖已存在的记录。

示例: UninstallLogMode=append

[Setup]: UpdateUninstallAppName
有效值: yes 或 no
默认值: yes

说明:
如果为 yes, 当添加到一个已存在的卸载记录时,安装程序将以当前的安装程序的 AppName 替换在卸载记录中的 AppName. 卸载记录中的 AppName 决定了卸载程序显示的标题。如果你的安装程序只是一个升级或附加到一个已存在的程序,并且你不想改变卸载程序的标题,那么你可以设置该值为 no.

[Setup]: DefaultGroupName
说明:
该关键字的值是默认的“程序管理器/开始菜单”程序组的名称,它被“选择程序组”向导页使用。如果该关键字为空或没有指定的话,它将会使用“(默认)”作为其名称。
注意: 记住 Windows 95/NT 4+ 的应用程序图标是作为文件直接存储的,这样一来普通文件所不允许使用的字符都不能用来作为应用程序图标的名称。

示例: DefaultGroupName=My Program

[Setup]: DisableStartupPrompt
有效值: yes 或 no
默认值: no

说明:
如果该值被设为 yes, 安装程序将不会显示“准备安装…,你希望继续吗?”的提示。

如果 UseSetupLdr 被设置为 no 该值将不会产生作用。

[Setup]: DiskSpanning
有效值: yes 或 no
默认值: no

说明:
决定编译器是创建一个单独的 SETUP.EXE, 还是把它分割成为几个文件以适合于放到分开的软磁盘上。当这个关键字被设置为 yes, 磁盘生成是允许的,将输出文件 SETUP.EXE 和 SETUP.1 复制到第一个磁盘上,SETUP.2 复制到第二个磁盘上,等等。

[Setup]: DiskSize
默认值: 1457664 (一个 1.44MB 软磁盘的大小)
说明:
指定了一个磁盘的可用空间统计数值的字节值。

如果 [Setup] 段的关键字 DiskSpanning 没有允许磁盘输出则这个关键字就会被忽略。

[Setup]: DiskClusterSize
默认值: 512 (软磁盘的标准的簇的大小)
说明:
它指定了磁盘介质的簇的大小。安装编译器需要知道该值为了适当的填充每一个磁盘的容量。

如果 [Setup] 段的关键字 DiskSpanning 没有允许磁盘输出则这个关键字就会被忽略。

[Setup]: ReserveBytes
默认值: 0
说明:
指定了应该在第一张磁盘上保留的最小空闲字节数,这样可以用于将其它的不是安装程序部分的文件复制到第一张磁盘上,比如说一个自述文档。

安装编译器将把这个数值取整为最接近的簇。

如果 [Setup] 段的关键字 DiskSpanning 没有允许磁盘输出则这个关键字就会被忽略。

[Setup]: DontMergeDuplicateFiles
有效值: yes 或 no
默认值: no

说明:
通常两个具有相同的源文件的项将只会被存储和压缩一次。如果你的安装程序中有一组相同的文件,在脚本中使他们只想相同的源文件,这样你的安装程序的能够明显缩小。如果由于某些原因你希望禁止这个功能,设置该关键字为 yes .

[Setup]: AllowNoIcons
有效值: yes 或 no
默认值: no

说明:
这个用于决定安装程序是否显示一个“不创建任何图标”的复选框,这样使用户能够跳过创建程序图标的过程。如果该项为 no 将不会显示复选框,如果为 yes 则将被显示。

如果安装程序运行在 NT 3.51 上时选择了“不创建任何图标”的复选框,那么用户能够彻底卸载应用程序的办法只有执行应用程序目录下面的 unins???.exe 文件。因为这个原因,我们推荐你保留 AllowNoIcons 设置为 no.

[Setup]: AllowRootDirectory
有效值: yes 或 no
默认值: no

说明:
当设置为 no 时,即默认的,用户将不能被允许在“选择目录页”向导中输入一个根目录(就像“C:\”)。

[Setup]: AlwaysRestart
有效值: yes 或 no
默认值: no

说明:
当设置为 yes, 安装程序始终会在一次成功的安装过程结束后提示用户重新启动系统,而不管这是不是必须的(因为在 [Files] 段的一些项当中带有 restartreplace 标记)。

[Setup]: MessagesFile
默认值: compiler:DEFAULT.ISL
说明:
指定要读取的默认信息的文件的名称。运行安装编译器时该文件必须位于你的安装程序的源目录中,除非指定了一个全程路径名称,或者路径名是以“compiler:”作为其前缀,这样它会在编译器的目录当中查找该文件。

当指定了多个文件时,它们时按照它们所排列的顺序被读取的,因而最后的消息文件中的消息就会覆盖其先前的消息文件。

请参见 [Messages] 段帮助主题关于 .isl 文件格式的详细资料。

示例: MessagesFile=compiler:czech.isl
MessagesFile=compiler:default.isl,compiler:mymessages.isl  

[Setup]: LicenseFile
说明:
指定一个可选的许可协议文件的名称,为 .txt 或 .rtf (丰富文本)格式,它在用户选择程序的目标文件夹之前被显示。运行安装编译器时该文件必须位于你的安装程序的源目录中,除非指定了一个全程路径名称,或者路径名是以“compiler:”作为其前缀,这样它会在编译器的目录当中查找该文件。
示例: LicenseFile=license.txt

[Setup]: InfoBeforeFile
说明:
指定一个可选的自述文档(Readme)的名称,为 .txt 或 .rtf (丰富文本)格式,它在用户选择程序的目标文件夹之前被显示。运行安装编译器时该文件必须位于你的安装程序的源目录中,除非指定了一个全程路径名称,或者路径名是以“compiler:”作为其前缀,这样它会在编译器的目录当中查找该文件。
示例: InfoBeforeFile=infobefore.txt

[Setup]: InfoAfterFile
说明:
指定一个可选的自述文档(Readme)的名称,为 .txt 或 .rtf (丰富文本)格式,它会在安装成功以后被显示。运行安装编译器时该文件必须位于你的安装程序的源目录中,除非指定了一个全程路径名称,或者路径名是以“compiler:”作为其前缀,这样它会在编译器的目录当中查找该文件。
这个不同于代有 isreadme 标记的文件项,它的文本是作为向导的一页被显示的,而后者显示于一个单独的记事本窗口。

示例: InfoAfterFile=infoafter.txt

[Setup]: ChangesAssociations
有效值: yes 或 no
默认值: no

说明:
当设置为 yes 时,安装程序会在其安装过程结束时告诉资源管理器要刷新它的文件关联信息,并且卸载程序在其卸载过程结束时也会去这样作。如果安装程序运行在 Windows NT 3.51 上时这个关键字时不起作用的。

如果你的安装程序创建了一个文件关联但是没有将 ChangesAssociations 设置为 yes, 该文件类型的正确的图标很可能不会被显示知道用户注销或者重新启动计算机。

[Setup]: UsePreviousAppDir
有效值: yes 或 no
默认值: yes

说明:
当该关键字被设置为 yes 时,即默认值,再安装程序启动时将会在注册表中查找看是否有相同的应用程序已经被安装,如果是这样,它将使用先前的安装程序的目录作为默认的目录提供给用户的向导。

注意只有 Inno Setup 1.3.1 和其后续版本才会在注册表中保存安装的目录,就是说安装程序不会“看见”老版本的 Inno Setup 安装的应用程序。

[Setup]: UsePreviousGroup
有效值: yes 或 no
默认值: yes

说明:
当该关键字被设置为 yes 时,即默认值,再安装程序启动时将会在注册表中查找看是否有相同的应用程序已经被安装,如果是这样,它将使用先前的安装程序的开始菜单组作为默认的开始菜单组提供给用户的向导。

注意只有 Inno Setup 1.3.1 和其后续版本才会在注册表中保存安装的目录,就是说安装程序不会“看见”老版本的 Inno Setup 安装的应用程序。

[Setup]: Password
说明:
指定一个口令,在安装过程开始时提示用户输入。
如果使用了一个口令,重要的是要紧记并没有加密技术被使用,并且 Inno Setup 的源代码是完全开放的,对于一个个别的富有经验的人来说从安装程序中移去口令的保护不是十分困难的。使用口令仅仅起到一个阻止那些没有得到授权的人使用你的安装程序。

[Setup]: WizardImageFile
默认值: compiler:WIZIMAGE.BMP
说明:
指定要在安装程序向导左侧显示的位图文件的名称。运行安装编译器时该文件必须位于你的安装程序的源目录中,除非指定了一个全程路径名称,或者路径名是以“compiler:”作为其前缀,这样它会在编译器的目录当中查找该文件。

当前还不支持 256 色位图,因为尚未使用调色板句柄。位图的最大尺寸是 117x231 象素。

示例: WizardImageFile=myimage.bmp

[Setup]: WindowShowCaption
有效值: yes 或 no
默认值: yes

说明:
如果设置为 no, 安装程序将会是真正的“全屏幕” ―― 它没有标题栏和边框,并且会位于任务栏的前面。

[Setup]: WindowStartMaximized
有效值: yes 或 no
默认值: yes

说明:
如果设置为 no, 安装程序启动时不会初始为最大化,这样会导致藏起任务栏。

[Setup]: WindowResizable
有效值: yes 或 no
默认值: yes

说明:
如果设置为 no, 在安装程序背景窗口不是最大化状态时用户将不能调整其大小。

[Setup]: WindowVisible
有效值: yes 或 no
默认值: yes

说明:
如果设置为 no, 安装程序背景窗口将是不可见的 ―― 只有向导和安装过程窗口。

[Setup]: WizardImageBackColor
有效值: 一个值形如 $bbggrr, 这里的 rr, gg 和 bb 指定了两位的亮度值(以十六进制表示)分别为红色,绿色和蓝色。或者也可以是下列预定义的颜色名称之一:clBlack(黑色),clMaroon(暗红),clGreen(绿色),clOlive(橄榄绿),clNavy(深蓝),clPurple(紫色),clTeal(深青),clGray(灰色),clSilver(浅灰),clRed(红色),clLime(浅绿),clYellow(黄色),clBlue(蓝色),clFuchsia(紫红),clAqua(青绿),clWhite(白色)。  
  
默认值: clTeal  

说明:
该关键字指定了用于填充向导位图(由 WizardImageFile 指定)周围的未使用区域的背景颜色。

[Setup]: SourceDir
说明:
给脚本指定一个新的源目录sourcedirectorynotes。
示例: SourceDir=c:\files

[Setup]: OutputDir
说明:
给脚本指定一个新的输出目录,这是安装编译器放置输出的 SETUP.* 文件的地方。默认情况下它在含有脚本文件的目录下创建一个“OUTPUT”子目录。
示例: OutputDir=c:\output


 
储伟杰 @ 2008-02-14 12:28

JavaScript - Browser detect type="text/javascript"> type="text/javascript" src="http://www.quirksmode.org/js/quirksmode.js">

Browser detect

See section 3D of the book.

The version detect doesn't work in Safari and OmniWeb because these browsers don't include comprehensible version information in their identity string.

A useful but often overrated JavaScript function is the browser detect. Sometimes you want to give specific instructions or load a new page in case the viewer uses, for instance, Safari.

If you're new to JavaScript, don't use this script. Please read the object detection page first.

Example

Let's detect your browser:

type="text/javascript">

The script

Copy this script into your JavaScript files. It works immediately, and you can query three properties of the BrowserDetect object:

  • Browser name: BrowserDetect.browser
  • Browser version: BrowserDetect.version
  • OS name: BrowserDetect.OS
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

This script will only continue to work if you regularly check whether newer browsers still follow the rules set forth in the dataBrowser and dataOS arrays.

Browser detection

The dataBrowser array is filled with objects that contain the properties that help the script detect your users' browser. Note its general syntax:

dataBrowser: [
	{
		prop: window.opera,
		identity: "Opera" // note: no comma
	},
	{
		string: navigator.userAgent,
		subString: "MSIE",
		identity: "Explorer",
		versionSearch: "MSIE" // note: no comma
	} // note: no comma
];

The [] define an array literal, and all of its elements are object literals. Each object literal is enclosed in curly braces {} and contains a few properties (name: value,). Note that a comma between the objects and between the properties is required, but that the last comma is always forbidden.

Properties

Every object in the dataBrowser array can contain the following properties:

  1. string and subString properties. These say: "search for subString in string". If the subString is found, the browser is identified.
  2. a prop property. It says "see if prop is supported". If it is, the browser is identified.
  3. an identity string. This string becomes the value of BrowserDetect.browser.
  4. a versionSearch string. This is for searching for the version number (see below). If this property is absent, the identity string is used instead.

Every object must contain either 1 or 2 (never both!), must contain 3 and may contain 4.

Example: Safari

As an example, here's the Safari object:

{
	string: navigator.vendor,
	subString: "Apple",
	identity: "Safari"
},

The script takes the value of navigator.vendor and sees if it contains the string "Apple". If it does, BrowserDetect.browser is set to "Safari" and the browser detection quits. If it doesn't, the script moves on to the next object.

Example: Opera

The next object is Opera:

{
	prop: window.opera,
	identity: "Opera"
},

Here the script checks if the property window.opera exists. If it does, BrowserDetect.browser is set to "Opera" and the browser detection quits. If it doesn't, the script moves on to the next object.

userAgent and vendor

The trick of browser detection is knowing where to look for the information you need. Traditionally we use navigator.userAgent. However, precisely because this check is traditional many minor browsers change their navigator.userAgent string so that bad detects written by amateur web developers are fooled into identifying it as Explorer. Section 3D of the book discusses this problem, as well as some gory details of navigator.userAgent.

More recently, new browsers have started to support the navigator.vendor property, which contains information about the vendor. In general I prefer to use this string for my detection, since it's less contaminated by obfuscation.

Of course, as soon as amateurs start using my detection script to detect Safari, Opera, Konqueror or other browsers, the browser vendors will be forced to change the value of navigator.vendor and my detect will not work any more.

Detection order

The objects in dataBrowser are used in the order they appear; that's why dataBrowser is an array. As soon as a positive identification is made the script ends, and it doesn't check the remaining objects.

Detection order is very important. The general rule is that you check for the minor browsers first. The reason is that many minor browsers give their users the opportunity to change identity in order to work around browser detects.

For instance, the Opera navigator.userAgent may contain "MSIE". If we'd check for Explorer first, we'd find the "MSIE" and would incorrectly conclude that the browser is Explorer. In order to avoid this false detection, we should check for Safari first. If the browser is Opera, the script never proceeds to the "MSIE" check.

Safari's navigator.userAgent also contains "Gecko". This causes the same problem: a check for Mozilla would reveal "Gecko", and Safari would be identified as Mozilla. Therefore the Mozilla check only takes place if the browser is not Safari.

If you add a new object to detect a new browser, always add it before the Explorer/Mozilla objects at the end of the array.

Version number

In general, the version number of a browser can be found directly after its name in navigator.userAgent. The script searches for this name and takes the number that appears after it. For instance, this is Konqueror's navigator.userAgent:

Mozilla/5.0 (compatible; Konqueror/3; Linux)

The script searches for the string "Konqueror", skips the next character, and takes the number after that. This is the version number. The script uses parseFloat, so that decimal places in the version number also become part of BrowserDetect.version.

Unfortunately Safari's string never contains its official version; only its internal Apple version number (ie. not 1.3.2 but 312.6). Therefore the version number detect doesn't work in Safari. Since this is clearly Apple's fault (it doesn't follow established conventions), I don't care.

versionSearch

In general, the browser name as it appears in navigator.userAgent is the same as the identification string. If the browser is "iCab", the script searches for "iCab".

However, Explorer needs "MSIE", Mozilla needs "rv", and older Netscape versions need "Mozilla". In order to accomodate these problems you may add a versionSearch property to the browser object. If it's there it's used for the version detect; if it's not there the identity string is used instead.

Take the Firefox and Explorer objects:

{
	string: navigator.userAgent,
	subString: "Firefox",
	identity: "Firefox"
},
{
	string: navigator.userAgent,
	subString: "MSIE",
	identity: "Explorer",
	versionSearch: "MSIE"
},

If the browser is Firefox, the script should look for the "Firefox" string. Since this is also the browser identity string, a special versionSearch is not necessary.

Explorer, however, puts its version number after the string "MSIE". Since I use "Explorer" as identity string, I have to define the versionSearch property as "MSIE".

userAgent and appVersion

The version detect script searches for the browser name in both navigator.userAgent and navigator.appVersion. The reason is iCab: this browser's navigator.userAgent may not contain the string "iCab", but navigator.appVersion always does.

Operating system

The OS detect works the same as the browser detect. Currently all my OS detects use navigator.platform, since this property appears to always contain the correct information.

navigator

Below you see the objects contained by the object navigator. These variables can be read out and give information about the browser and computer of your users. Use this information to add new objects to the browser detect.

 type="text/javascript">