Inno预处理入门二:常用ISPP指令
Inno预处理/Inno条件编译常用指令说明
指令名称 | 指令解释 | ||
#define | 定义变量,宏。支持私有变量,保护变量,公有变量。上一节文章已经介绍,这里就不赘述了。 | ||
;定义字符串变量 #define MyAppName "My Program" ;使用GetFileVersion获取文件的版本,并赋予MyAppVer #define MyAppVer GetFileVersion("MyProg.exe") ;定义数组0号成员的值为 15 #define MyArray[0] 15 ;定义函数int代表参数类型为整型 | |||
#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"的行,并将之设置为输入行 | |||
#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 |