我正在运行此代码:
function CmdLineParamExists(const Value: string): Boolean;
var
I: Integer;
begin
Result := False;
for I := 1 to ParamCount do
begin
if CompareText(Copy(ParamStr(I), 1, Length(Value)), Value) = 0 then
begin
Result := True;
Exit;
end;
end;
end;
function GetAppName(Value: string): string;
begin
if CmdLineParamExists('/COMPONENTS=prog2') then
begin
Result := 'Программа 2'; //<----This shows up as ????????? 2
end
else
begin
Result := '{#SetupSetting("AppName")}';
end;
end;
procedure CurPageChanged(CurPageID: Integer);
var
S: string;
Begin
if CurPageID = wpSelectDir then
begin
S := SetupMessage(msgSelectDirLabel3);
StringChange(S, '[name]', GetAppName(''));
WizardForm.SelectDirLabel.Caption := S;
end;
end;
现在,我不确定我在这里做错了什么。除非我使用GetAppName
的结果,否则每个其他字符串都会正确显示。我应该在某个时候将任何内容转换为AnsiString
吗?
答案 0 :(得分:2)
我假设您使用的是Inno Setup的Ansi版本。
在Ansi版本中,罪魁祸首可能是StringChange
,因为它与非安西字符集不能很好地配合。尝试使用StringChangeEx
。
尽管你应该使用Inno Setup的Unicode版本。
只有最新版本的Inno Setup 5.6支持Unicode字符串文字。所以请确保您拥有最新版本。
如果您遇到旧版本:
对字符串进行编码,如
#$041F#$0440#$043E#$0433#$0440#$0430#$043C#$043C#$0430 + ' 2'
或者,实际上最正确的方法是向语言文件添加新的自定义消息(例如Russian.isl
):
[CustomMessages]
Program2=Программа 2
然后加载它:
CustomMessage('Program2')