您正在使用 Internet Explorer 6,在本页面的显示效果可能有差异。建议您升级到 Internet Explorer 8 或以下浏览器: Firefox / Chrome / Safari / Opera
首 页 文章Inno Inno预处理入门二:常用ISPP指令

Inno预处理入门二:常用ISPP指令

Inno预处理/Inno条件编译常用指令说明

指令名称

指令解释

  

#define

定义变量,宏。支持私有变量,保护变量,公有变量。上一节文章已经介绍,这里就不赘述了。

  
 

;定义字符串变量

#define MyAppName "My Program"

;使用GetFileVersion获取文件的版本,并赋予MyAppVer

#define MyAppVer GetFileVersion("MyProg.exe")

;定义数组0号成员的值为 15

#define MyArray[0] 15

;定义函数int代表参数类型为整型

#define Multiply(int A, int B = 10) A * B 
  

#dim

#redim

声明数组 / 对已存在数据重新设置长度,每个数组成员可用#define来定义。支持私有变量,保护变量,公有变量。

  
 

;定义长度为10的数组

#dim MyArray[10]

;定义数组0号成员的值为 15

#define MyArray[0] 15

;重置数组的长度为20

#redim MyArray[20]

;定义数组10号成员的值为 30

#define MyArray[10] 30

;重置数组的长度为10

#redim MyArray[10]

  

#undef

取消变量,宏的定义。支持私有变量,保护变量,公有变量。

如果没有指定,则按照如下顺序取消变量:私有变量 -> 保护变量 -> 公有变量

  
 

;取消定义

#undef MyVar

;取消公有变量定义

#undef public MyVar

  

#include

引用脚本文件。

其中有一个特别的用法:#include <文件名>,

会首先查找当前脚本所在的目录,然后会查找引用当前文件的脚本所在目录,依次向上。

当然如果你指定了绝对目录,那么会直接引用那个文件。

但如果你指定了文件名,一般是会先查找#pragma里面设置的引用路径下是否包含文件。

  
 

;按照上文所说的顺序引用文件

#include <file.iss>

;引用指定路径的文件

#include "c:\dir\file.iss"

;引用编译器目录下的common.iss文件

#include AddBackslash(CompilerPath) + "common.iss"

  

#file

类似于引用文件,但不同的是,它不但会解析引用文件中的ISPP代码,还会将解析之后的代码生成一个临时文件。

一般这个指令用在Inno需要指定文件的位置,比如:许可协议,安装前后的说明,以及[Files]。

要注意的有三点:

1、这个文件会在编译完成之后自动删除。

2、当前脚本的ISPP变量会传递进去,但在该文件中修改的变量,不会传递回来。

3、如果你在[Files]使用的话,一定要指定DestName,因为生成的临时文件的名字和源文件名字是不一样的。

  
 

[Setup]

;生成并设置许可文件

LicenseFile={#file "mylic.txt"}

  

#emit

执行并显示变量/表达式的结果。上一节文章已经介绍,这里就不赘述了。

  
 

[Files]

;单行模式

#emit 'Filename: "file1.ext"; DestDir: {' + MyDestDir + '}'

;行内模式

Filename: "file2.ext"; DestDir: {{#MyDestDir}}

  

#expr

执行,但是不显示结果。

  
 

;执行保存当前解析过的内容到文件,并用编译器打开保存的文件

;SaveToFile是保存文件的函数,AddBackslash是为路径增加斜杠的函数,Exec是运行的函数

;SourcePath表示安装脚本目录,CompilerPath表示编译器目录

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss"), Exec(AddBackslash(CompilerPath) + "Compil32.exe", """" + AddBackslash(SourcePath) + "Preprocessed.iss""")

注意:Exec前面逗号,是代表上一个表达式结束了。

  

#insert

改变当前脚本的输入位置。允许用代码在指定位置插入内容。

而在默认的情况下,新增加的内容是附加在当前文档位置/末尾。

通常可配合Find来定位需要插入的代码位置。

  
 

;查找Setup段并在之后一行插入内容

#insert FindSection("Setup") + 1

;查找包含"somefile.ext"的行,并将之设置为输入行

#insert Find(0, "somefile.ext", FIND_CONTAINS)
  

#append

改为附加模式,一般是使用了#insert之后,想要恢复成附加模式。无参数。

  
 

#append

 

#if

#elif

#else

#endif

条件指令。

允许嵌套,但需要注意的是,虽然是嵌套了,

但里面的变量如果未定义依然会引发编译错误。

“且” 使用 &&, “或”使用 ||,“等于”使用 ==,"不等于"使用 !=, ()代表一个组

 
 

#define Test "KngStr"

#if Test == "KngStr"

#elif Test == "King"

#elif Test != "K" || Test != "S"

#else

#endif

  

#ifdef

#ifndef

#ifexsist

#ifnexist

特殊条件指令,

#ifdef,     判断变量是否定义

#ifndef,   判断变量是否没有定义

#ifexsist, 判断文件是否存在

#ifnexist, 判断文件是否不存在

  
 [Files]
#ifexist "myfile.ext"
  Filename: "myfile.ext"; DestDir: {app}
#endif
#ifdef Enterpise
  Filename: "extra.dll"; DestDir: {app}
#endif
  

#for

循环。

  
 #for {i = 200; i > 0; i--} AddFile
;开始的时候会执行i = 200;此时i被初始化为200.
;每次循环都会执行i > 0;来判断是否继续执行
;i--代表自减,比如第二次的时候相当于 200 - 1. 也就是说i这是等于199.
;AddFile是#sub定义的一个过程,下面会讲到。
  

#sub

#endsub

声明一个过程,方便脚本的生成。比如上面的循环,就可以循环在脚本插入多条内容。

过程只有被调用的时候才会被解析。

过程不支持参数,仅根据名字简单调用。

  
 #sub AddFile
  #if Copy(FileName, 1, 1) == "A"
    Source: {#FileName}; DestDir: {app}\A
  #else
    Source: {#FileName}; DestDir: {app}
  #endif
#endsub
  

#pragma

ISPP系统设定。之后会详解,这里就跳过了。

  
    

#error

显示错误消息,并停止编译。需要注意的是,这里显示的消息里面的ISPP变量不会被解析。

如果你需要解析变量,请使用#pragma error。

  
 #if VER < EncodeVer(5,4,2)
  #error 需要5.4.2或者更高版本
#endif
  
返回顶部】 【打印此页】 【关闭