如何在InstallShield 2015的MSI安装程序中传入十六进制值?
在InstallShield 2015中处理命令行传入的十六进制LCID并写入注册表
下面提供几种可行的解决方法:
方法一:用InstallScript脚本转换十六进制到十进制
- 先在InstallShield里定义一个公共属性(比如
LCID_HEX),用来接收命令行传入的十六进制值,命令行格式改为:msiexec /i setup.msi LCID_HEX=0x9 - 添加InstallScript脚本,在安装流程的合适节点(比如
OnFirstUIBefore)完成转换:function OnFirstUIBefore() STRING szLCIDHex, szLCIDDec; NUMBER nResult; begin // 读取命令行传入的十六进制LCID MsiGetProperty(ISMSI_HANDLE, "LCID_HEX", szLCIDHex, nResult); if (szLCIDHex != "") then // 去掉0x前缀,转换为十进制数值 szLCIDHex = Right(szLCIDHex, Length(szLCIDHex)-2); nResult = StrToNum(szLCIDHex, 16); // 将转换后的十进制值存入用于注册表写入的属性LCID MsiSetProperty(ISMSI_HANDLE, "LCID", NumToStr(nResult)); endif; // 保留原有脚本逻辑... end; - 最后在注册表配置界面,选择DWORD类型,用
[LCID]作为值,安装时就会把转换后的十进制值以DWORD格式写入注册表(MSI会自动处理十进制到DWORD的存储转换)
方法二:直接传入十进制值(最简单方案)
如果可以提前将十六进制LCID转成十进制,直接用命令行传入十进制值即可:msiexec /i setup.msi LCID=9(0x9对应的十进制是9)。这种情况下无需额外脚本,直接把[LCID]属性绑定到DWORD类型的注册表项,MSI会自动将十进制数值转为正确的DWORD格式存储。
方法三:用VBScript自定义动作完成转换
- 添加一个VBScript类型的自定义动作,设置执行时机为
InstallInitialize之后,属性设为公共 - VBScript代码如下:
Dim objMSI, szHexLCID, nDecLCID Set objMSI = CreateObject("WindowsInstaller.Installer") szHexLCID = objMSI.Property("LCID_HEX") If szHexLCID <> "" Then ' 移除0x前缀并转换为十进制 szHexLCID = Replace(szHexLCID, "0x", "") nDecLCID = CLng("&H" & szHexLCID) objMSI.Property("LCID") = CStr(nDecLCID) End If Set objMSI = Nothing - 命令行传入
msiexec /i setup.msi LCID_HEX=0x9,注册表项依然使用[LCID]属性写入DWORD类型即可
内容的提问来源于stack exchange,提问作者logeeks
相关产品推荐
相关产品推荐

