Выберите между исходными путями для всех файлов
Я автоматически запускаю обфускатор при компиляции своего проекта в visual studio. Обфусцированные DLL-файлы сохраняются с тем же именем файла, но в подпапках.
Структура папок
FileA_Secure (subfolder)
FileA.dll
FileA.dll
Вопрос: Могу ли я убедиться, что Inno Setup компилируется FileA.dll
из подпапки FileA_Secure
а не FileA.dll
из основной папки, если "обеспечено" FileA.dll
существует?
1 ответ
Решение
Вы можете использовать препроцессор Inno Setup для условного выбора источника. В частности, используйте #ifexist
директива:
[Files]
#ifexist "MyClass_Secure\MyClass.dll"
Source: "MyClass_Secure\MyClass.dll"; DestDir: "{app}"
#else
Source: "MyClass.dll"; DestDir: "{app}"
#endif
добавлять SaveToFile
до конца вашего.iss, чтобы увидеть, как выглядит финальный сценарий:
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
Если вам нужно сделать это для многих файлов, вы можете определить макрос:
#define GetDllSource(Name) \
FileExists(Name + "_Secure\" + Name + ".dll") ? \
Name + "_Secure\" + Name + ".dll" : Name + ".dll"
[Files]
Source: {#GetDllSource("MyClass")}; DestDir: "{app}"
Source: {#GetDllSource("MyClass2")}; DestDir: "{app}"
Если вы хотите сделать это для всех файлов в папке и ее подпапках, это станет намного сложнее:
#pragma parseroption -p-
; For given DLL, return path to secured DLL, if exists, otherwise return the DLL itself
#define GetDllSource(FileName) \
Local[0] = ExtractFileName(FileName), \
Local[1] = Pos(".", Local[0]), \
Local[2] = Local[1] > 0 ? Copy(Local[0], 1, Local[1] - 1) : Local[0], \
Local[3] = ExtractFilePath(FileName), \
Local[4] = Local[3] + "\\" + Local[2] + "_Secure\\" + Local[0], \
FileExists(Local[4]) ? Local[4] : FileName
; For DLLs, returns [Files] section entry, skip other files
#define FileEntry(Source) \
(ExtractFileExt(Source) != "dll") ? \
"" : "Source: " + GetDllSource(Source) + "; DestDir: {app}\n"
; If the directory entry is folder, call ProcessFolder.
; If it is a file, call FileEntry
#define ProcessFile(Source, FindResult, FindHandle) \
FindResult \
? \
Local[0] = FindGetFileName(FindHandle), \
Local[1] = Source + "\\" + Local[0], \
(Local[0] != "." && Local[0] != ".." \
? (DirExists(Local[1]) ? ProcessFolder(Local[1]) : FileEntry(Local[1])) \
: "") + \
ProcessFile(Source, FindNext(FindHandle), FindHandle) \
: \
""
; If the folder is not _Secure, process its files and subfolders
#define ProcessFolder(Source) \
(Pos("_Secure", ExtractFileName(Source)) > 0) ? \
"" : \
(Local[0] = FindFirst(Source + "\\*", faAnyFile), \
ProcessFile(Source, Local[0], Local[0]))
#pragma parseroption -p+
[Files]
; Process this folder for DLLs and subfolders (can be changed for a real path)
#emit ProcessFolder(".")