2012-08-17 120 views
1

對於安裝程序,我需要創建文件夾鏈接。如何使用Pascal Inno Setup使用字符串變量ExpandConstant?

爲此,我使用'[Dirs]'部分創建目標文件夾。沒問題。

然後,在「[代碼]」部分中,使用函數「CurStepChanged(ssPostInstall)」,I讀取臨時安裝的文件,以獲得夾鏈接來創建的列表。文件的每一行都包含一個目標文件夾路徑名和一個鏈接路徑名...使用Inno Setup常量。 每個值都以「String」變量的形式讀取和存儲。

當我通過這些字符串變量「ExpandConstant(lLinkTarg)」,我得到任何常量名的內部運行時錯誤。

如果我複製粘貼的字符串內容爲 'ExpandConstant('{#gRepNasSvg} \ {UT代碼:getProjetc} \文件 ')' 調用,那麼它的工作原理...

任何暗示什麼,我做錯了 ?

在此先感謝。 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代碼:getProjetc} \文件' ......

回答

2

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

(你應該總是至少包括以下\目錄在調用ExpandConstant時是不變的,並且在那裏包含額外的文本沒有任何壞處,只要它不包含任何特殊字符即可。)

儘管如此,您嘗試讀取的文件的內容是什麼?

請注意,ExpandConstant不會(也不能)擴展{#var}樣式常量,它們在編譯時由預處理器擴展,並且不能在運行時擴展。嘗試從[代碼]功能中擴展{code:...}常量通常也是不好的方式。

首先使用文件的原因是什麼?它在安裝過程中是由什麼產生的?如果不是(或者即使如此,您也可以在腳本中執行代替而不是外部代碼),那麼您應該在代碼中使用數組。

相關問題