4

对于安装程序,我需要创建文件夹链接。

为此,我使用“[Dirs]”部分创建目标文件夹。没问题。

然后,在“[代码]”部分,使用函数“CurStepChanged(ssPostInstall)”,我读取了一个临时安装文件,以获取要创建的文件夹链接列表。文件的每一行都包含一个目标文件夹路径名和一个链接路径名... 使用 Inno Setup 常量。每个值都被读取并存储为“字符串”变量。

当我将这些字符串变量传递给“ExpandConstant(lLinkTarg)”时,任何常量名称都会出现内部运行时错误。

如果我将字符串内容复制粘贴到 'ExpandConstant('{#gRepNasSvg}\UT{code:getProjetc}\Docs')' 调用,那么它可以工作......

关于我做错了什么的任何提示?

提前致谢。L.

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'...

4

1 回答 1

3

ExpandConstant('{tmp}\{#gFicListeLiens}');

(您应该始终在对 ExpandConstant 的调用中至少包含\以下目录常量,并且在其中包含其他文本没有害处,只要它不包含任何特殊字符。)

但是,您要读取的文件的内容是什么?

请注意,ExpandConstant 不会(也不能)扩展{#var}样式常量,它们在编译时由预处理器扩展,并且不能在运行时扩展。尝试{code:...}从 [Code] 函数中扩展常量通常也是不好的风格。

首先使用文件的原因是什么?它是在安装过程中由某些东西生成的吗?如果不是(或者即使是这样,并且您可以在脚本中而不是外部的东西中进行生成),您应该只在代码中使用一个数组。

于 2012-08-18T02:29:20.353 回答