inno-setup – 从Ansi升级到Inno Setup的Unicode版本(任何缺点)
与Ansi版本相比,Inno Setup Unicode版本有任何缺点吗?
或者是什么原因仍然是两个版本并行提供,而不仅仅是Unicode版本? 在使用Ansi版本开发的现有Inno Setup项目中使用Unicode版本时是否存在任何潜在问题? 解决方法
没有真正的缺点.主要有优点.显然,Unicode版本不仅限于传统的Ansi字符集.请参阅下文了解详情.
如果要启动新的Inno Setup项目,请始终使用Unicode版本.没有理由将Ansi版本用于新项目. 原因,为什么Ansi版本的Inno Setup仍然可用,是Ansi和Unicode版本的Pascal脚本代码不是100%兼容的.他们大多是,但有差异. 因此,如果您现有的安装程序脚本没有任何Pascal Script code(您的.iss中没有 如果你有一些Pascal脚本代码,你应该更加小心.请参阅下文了解详情. 为什么要使用Unicode版本 例如Ansi版本的问题,如果您在英文系统上运行使用Ansi版本的Inno Setup构建的仅限日语的安装程序,您将获得: 另见Inno Setup installator has wrong text encoding. 出于同样的原因,Ansi版本将无法创建名称包含字符的文件,这些文件在目标计算机的旧版Ansi字符集中不存在. Unicode版本没有这些问题,如Unicode Inno Setup article中所述:
此外,Unicode版Pascal脚本还有一些小的改进.它们记录在Unicode Inno Setup article中.最重要的是,几乎没有未记录的改进: > Inc / Dec函数/语句.见Inc function Inno Setup. Pascal脚本代码中可能存在的问题 Pascal脚本代码中可能出现问题的区域很少: >对DLL函数的任何调用都采用字符串参数 – 字符串和PChar类型. AnsiString应该没问题,因为它在Unicode版本中是相同的. 在Unicode版本中,PChar被重命名为PAnsiChar. 如果您调用任何使用字符串的Windows API函数,则应切换到其Wide版本.例如.使用GetFileAttributesW而不是GetFileAttributesA.没有PWideChar类型.因此,如果您的声明在Ansi版本中使用了PChar类型,并且您切换到该函数的Wide版本,则必须使用字符串类型. Inno Setup会自动将其封送到LPCTSTR(或类似的),也就是PWideChar. 以下声明在Ansi版本中是正确的,但在Unicode版本中是错误的,因为GetFileAttributesA采用PAnsiChar,但字符串编组为Unicode版本中的PWideChar. function GetFileAttributes(lpFileName: string): DWORD; external 'GetFileAttributesA@kernel32.dll stdcall'; 有关完整示例和解决方案,请参阅Inno Setup FileExists unable to find existing file. 在极少数情况下,您正在调用具有out PWideChar参数的函数(var S:PWideChar),使用它时非常棘手,没有实际的PWideChar类型,因为在这种情况下您不能使用字符串编组.但这是可行的,见Constant for AppDataLocalLow? 与Windows API类似,某些第三方库也在其API中提供带有Unicode字符串的单独Unicode版本.例如ISSkin有ISSkinU.dll.见Getting ISSkin to work with latest Inno Setup 5.5.9 Unicode. function Read(Buffer: String; Count: Longint): Longint; function Write(Buffer: String; Count: Longint): Longint; procedure ReadBuffer(Buffer: String; Count: Longint); procedure WriteBuffer(Buffer: String; Count: Longint); 应该使用AnsiString重新声明这些方法.对我来说看起来像个错误. 要使这些方法在Unicode版本中可用,请使用@TLama中的BufferToAnsi函数,该函数在许多现有答案中使用,例如: > Inno Setup LoadStringFromFile fails when file is open in another process > Unicode版本不允许使用char变量集(因为多字节类型不允许使用set).虽然有趣的是它支持表达式中的char常量集.见“Type mismatch” error on “set of char” in Pascal Script of the Inno Setup Unicode version. 如果您的代码不使用上述任何一项,并且您的分号正确,则不应该对Unicode版本有任何问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |