对于安装程序,我需要创建文件夹链接。
为此,我使用'[Dirs]'部分创建目标文件夹。没问题。
然后,在'[Code]'部分,使用函数'CurStepChanged(ssPostInstall)',我读取一个临时安装的文件,以获取要创建的文件夹链接列表。该文件的每一行包含目标文件夹路径名和链接路径名...使用Inno Setup常量。 读取每个值并将其存储为“String”变量。
当我将这些字符串变量传递给'ExpandConstant(lLinkTarg)'时,我在任何常量名称上都会收到内部运行时错误。
如果我将字符串内容粘贴到'ExpandConstant('{gRepNasSvg} \ UT {code:getProjetc} \ Docs')'调用,那么它可以正常运行......
关于我做错了什么的提示?
提前致谢。 升。
procedure CurStepChanged(CurStep: TSetupStep);
var
lFileName: String;
lLinkList: TArrayOfString;
lIndex: Integer;
lLinkLine: String;
lLinkName: String;
lLinkTarg: String;
lSepPos: Integer;
begin
// Après l'étape d'installation...
if CurStep = ssPostInstall then
begin
// Si le fichier listant les liens à créer existe...
lFileName := ExpandConstant('{tmp}') + '\' + ExpandConstant('{#gFicListeLiens}');
if FileExists(lFileName) then
begin
// Lecture du contenu du fichier.
LoadStringsFromFile(lFileName, lLinkList);
// Pour chaque ligne lue...
for lIndex := 0 to GetArrayLength(lLinkList) - 1 do
begin
// Lecture de la ligne.
lLinkLine := Trim(lLinkList[lIndex]);
// Si ce n'est pas un commentaire...
if (Length(lLinkLine) > 0) and (lLinkLine[1] <> ';') then
begin
// Recherche du séparateur.
lSepPos := Pos('>', lLinkLine);
if lSepPos > 0 then
begin
// Get target location.
lLinkTarg := Trim(Copy(lLinkLine, 1, lSepPos - 1));
MsgBox(lLinkTarg, mbInformation, MB_OK);
// NEXT LINE FAILS !
lLinkTarg := ExpandConstant(lLinkTarg) ;
MsgBox(lLinkTarg, mbInformation, MB_OK);
// Get link location.
lLinkName := Trim(Copy(lLinkLine, lSepPos + 1, Length(lLinkLine) - lSepPos));
MsgBox(lLinkName, mbInformation, MB_OK);
end
end
end
end
end
end;
我遗忘的一些东西。
链接描述变量的格式为'{#gRepNasSvg} \ UT {code:getProjetc} \ Docs'...
答案 0 :(得分:2)
ExpandConstant('{tmp}\{#gFicListeLiens}');
(在对ExpandConstant的调用中,您应该始终至少包含\
目录常量,并且如果不包含任何特殊字符,则在其中包含其他文本没有任何害处。)< / p>
但您尝试阅读的文件内容是什么?
请注意,ExpandConstant不会(也不能)扩展{#var}
样式常量,这些常量在编译时由预处理器扩展,并且不能在运行时扩展。尝试从[Code]函数中扩展{code:...}
常量通常也是不好的风格。
首先使用文件的原因是什么?是否在安装过程中由某些东西生成?如果不是(或者即使如此,你可以在脚本中进行生成而不是外部生成),你应该在代码中使用一个数组。