How to use wildcards in [CustomMessages] section of Inno Setup?

ぐ巨炮叔叔 提交于 2020-12-06 15:51:23

问题


Why can't I use a wildcard for this?

[CustomMessages]

; ==================================================================
; Inno Download Plugin custom messages

#include ".\idplang\Arabic.iss"
#include ".\idplang\Bulgarian.iss"
#include ".\idplang\ChineseSimplified.iss"
#include ".\idplang\Croatian.iss"
#include ".\idplang\Czech.iss"
#include ".\idplang\Danish.iss"
#include ".\idplang\Finnish.iss"
#include ".\idplang\French.iss"
#include ".\idplang\German.iss"
#include ".\idplang\Hungarian.iss"
#include ".\idplang\Italian.iss"
#include ".\idplang\Japanese.iss"
#include ".\idplang\Polish.iss"
#include ".\idplang\PortugueseBrazil.iss"
#include ".\idplang\PortuguesePortugal.iss"
#include ".\idplang\Romanian.iss"
#include ".\idplang\Russian.iss"
#include ".\idplang\Spanish.iss"
#include ".\idplang\Turkish.iss"

I tried:

#include ".\idplang\*.iss"

It does not like it:

D:\My Programs\2019\MeetSchedAssist\Inno\MeetSchedAssist2019_v6.iss(660,1): error : Error on line 660: [ISPP] File not found: "D:\My Programs\2019\MeetSchedAssist\Inno\.\idplang\*.iss".

Here is another example in my installer (and I have another in the [Registry] section):

#include AddBackslash(SourcePath) + ".\l.afk\CustomMessagesAfrikaans.txt"
#include AddBackslash(SourcePath) + ".\l.sqi\CustomMessagesAlbanian.txt"
#include AddBackslash(SourcePath) + ".\l.ara\CustomMessagesArabic.txt"
#include AddBackslash(SourcePath) + ".\l.hye\CustomMessagesArmenian.txt"
#include AddBackslash(SourcePath) + ".\l.bgr\CustomMessagesBulgarian.txt"
#include AddBackslash(SourcePath) + ".\l.chs\CustomMessagesChineseSimplified.txt"
#include AddBackslash(SourcePath) + ".\l.hrv\CustomMessagesCroatian.txt"
#include AddBackslash(SourcePath) + ".\l.csy\CustomMessagesCzech.txt"
#include AddBackslash(SourcePath) + ".\l.dan\CustomMessagesDanish.txt"
#include AddBackslash(SourcePath) + ".\l.nld\CustomMessagesDutch.txt"
#include AddBackslash(SourcePath) + ".\l.eti\CustomMessagesEstonian.txt"
#include AddBackslash(SourcePath) + ".\l.fin\CustomMessagesFinnish.txt"
#include AddBackslash(SourcePath) + ".\l.fra\CustomMessagesFrench.txt"
#include AddBackslash(SourcePath) + ".\l.deu\CustomMessagesGerman.txt"
#include AddBackslash(SourcePath) + ".\l.ell\CustomMessagesGreek.txt"
#include AddBackslash(SourcePath) + ".\l.hin\CustomMessagesHindi.txt"
#include AddBackslash(SourcePath) + ".\l.hun\CustomMessagesHungarian.txt"
#include AddBackslash(SourcePath) + ".\l.ind\CustomMessagesIndonesian.txt"
#include AddBackslash(SourcePath) + ".\l.ita\CustomMessagesItalian.txt"
#include AddBackslash(SourcePath) + ".\l.jpn\CustomMessagesJapanese.txt"
#include AddBackslash(SourcePath) + ".\l.plk\CustomMessagesPolish.txt"
#include AddBackslash(SourcePath) + ".\l.ptb\CustomMessagesPortuguese.txt"
#include AddBackslash(SourcePath) + ".\l.ptg\CustomMessagesPortuguesePortugal.txt"
#include AddBackslash(SourcePath) + ".\l.rom\CustomMessagesRomanian.txt"
#include AddBackslash(SourcePath) + ".\l.rus\CustomMessagesRussian.txt"
#include AddBackslash(SourcePath) + ".\l.slv\CustomMessagesSlovenian.txt"
#include AddBackslash(SourcePath) + ".\l.esp\CustomMessagesSpanish.txt"
#include AddBackslash(SourcePath) + ".\l.sve\CustomMessagesSwedish.txt"
#include AddBackslash(SourcePath) + ".\l.trk\CustomMessagesTurkish.txt"
#include AddBackslash(SourcePath) + ".\l.ukr\CustomMessagesUkrainian.txt"

回答1:


You cannot use wildcard in the #include directive.

But you can use a preprocessor code like this:

#define IncludeFolder ".\idplang\"

#define FindHandle
#define FindResult

#sub IncludeFoundFile
  #include IncludeFolder + FindGetFileName(FindHandle)
#endsub

#for {FindHandle = FindResult = FindFirst(IncludeFolder + "*.iss", faAnyFile); \
      FindResult; FindResult = FindNext(FindHandle)} IncludeFoundFile
#expr FindClose(FindHandle)

Another option is implementing a recursive preprocessor function. It has size limitations though. But on the other hand, it can be reused, if you need to include another set of files elsewhere. And it makes it easier to implement a recursive include:

#define IncludeFileLine(Handle) \
    !FileEof(Handle) ? FileRead(Handle) + NewLine + IncludeFileLine(Handle) : ""

#define IncludeFile(Source) \
    Local[0] = FileOpen(Source), \
    Local[1] = IncludeFileLine(Local[0]), \
    FileClose(Local[0]), \
    Local[1]

#define IncludeFileInFolder(Source, FindResult, FindHandle) \
    FindResult \
        ? \
            Local[0] = FindGetFileName(FindHandle), \
            Local[1] = Source + "\\" + Local[0], \
            (Local[0] != "." && Local[0] != ".." \
                ? (DirExists(Local[1]) ? \
                      IncludeFilesInFolder(Local[1]) : IncludeFile(Local[1])) \
                : "") + \
            IncludeFileInFolder(Source, FindNext(FindHandle), FindHandle) \
        : \
            ""

#define IncludeFilesInFolder(Source) \
    Local[0] = FindFirst(Source + "\\*", faAnyFile), \
    Local[1] = IncludeFileInFolder(Source, Local[0], Local[0]), \
    FindClose(Local[0]), \
    Local[1]

Use it like:

#emit IncludeFilesInFolder(AddBackslash(SourcePath) + "idplang")


来源:https://stackoverflow.com/questions/62510730/how-to-use-wildcards-in-custommessages-section-of-inno-setup

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!