I\'m using an Inno Setup #define directive to define all of the information about a software package in my installer and then other directives to extract portions of that st
This cannot work.
The PartNumber
is a preprocessor function/macro. It's evaluated on compile time. It does not exist on run time.
You can, of course, implement an equivalent Pascal Script function:
function PartNumberPascal(Package: string): string;
begin
Result := Copy(Package, 1, 5);
end;
procedure Foo(Package: String);
var
PartNumber: String;
begin
PartNumber := PartNumberPascal(Package);
end;
What probably confuses you, is this call:
Foo(ExpandConstant('{#Package1}'));
It may give you an impression that the ExpandConstant function expands the Package1
preprocessor define.
It does not!
The {#...}
syntax (contrary to the {...}
) is not a constant. It's an inline preprocessor directive call, where, when no directive is explicitly specified, the emit is implied. So the {#Package1}
is the same as {#emit Package1}
. And as every preprocessor construct, it's evaluated on compile time.
If you add SaveToFile preprocessor function call to the end of the script:
procedure Bar();
begin
Foo(ExpandConstant('{#Package1}'));
end;
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
And after compilation, check, what the Preprocessed.iss
is like. You will see:
procedure Bar();
begin
Foo(ExpandConstant('05414 - My Package'));
end;
The Package1
is expanded to its value. But the ExpandConstant
is still there, and hence it's totally useless! (there are no constants in the '05414 - My Package'
)
This would have the same effect:
procedure Bar();
begin
Foo('{#Package1}');
end;
For a similar question, see:
Evaluate a collection of data from preprocessor on run time in Inno Setup Pascal Script