如何将 Pascal Inno Setup ExpandConstant 与字符串变量一起使用?

zeP*_*Pit 5 inno-setup constants pascalscript

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

提前致谢。\nL.

\n\n
procedure CurStepChanged(CurStep: TSetupStep);\nvar\n    lFileName: String;\n    lLinkList: TArrayOfString;\n    lIndex: Integer;\n    lLinkLine: String;\n    lLinkName: String;\n    lLinkTarg: String;\n    lSepPos: Integer;\n\nbegin\n    // Apr\xc3\xa8s l'\xc3\xa9tape d'installation...\n    if CurStep = ssPostInstall then\n        begin\n            // Si le fichier listant les liens \xc3\xa0 cr\xc3\xa9er existe...\n            lFileName := ExpandConstant('{tmp}') + '\\' + ExpandConstant('{#gFicListeLiens}');\n            if FileExists(lFileName) then\n                begin\n                    // Lecture du contenu du fichier.\n                    LoadStringsFromFile(lFileName, lLinkList);\n\n                    // Pour chaque ligne lue...\n                    for lIndex := 0 to GetArrayLength(lLinkList) - 1 do\n                    begin\n                        // Lecture de la ligne.\n                        lLinkLine := Trim(lLinkList[lIndex]);\n\n                        // Si ce n'est pas un commentaire...\n                        if (Length(lLinkLine) > 0) and (lLinkLine[1] <> ';') then\n                            begin\n                                // Recherche du s\xc3\xa9parateur.\n                                lSepPos := Pos('>', lLinkLine);\n                                if lSepPos > 0 then\n                                    begin\n                                        // Get target location.\n                                        lLinkTarg := Trim(Copy(lLinkLine, 1, lSepPos - 1));\nMsgBox(lLinkTarg, mbInformation, MB_OK);\n\n                                        // NEXT LINE FAILS !\n                                        lLinkTarg := ExpandConstant(lLinkTarg) ;\nMsgBox(lLinkTarg, mbInformation, MB_OK);\n\n                                        // Get link location.\n                                        lLinkName := Trim(Copy(lLinkLine, lSepPos + 1, Length(lLinkLine) - lSepPos));\nMsgBox(lLinkName, mbInformation, MB_OK);\n\n                                    end\n                            end\n                    end\n                end\n        end\nend;\n
Run Code Online (Sandbox Code Playgroud)\n\n

有些东西我已经忘记了。

\n\n

链接描述变量的格式为 '{#gRepNasSvg}\\UT{code:getProjetc}\\Docs'...

\n

Mir*_*ral 4

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

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

但是,您尝试读入的文件的内容是什么?

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

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