Inno setup中定制安装路径

转自: Inno setup中定制安装路径 - microsun - 博客园

我的程序修改了安装界面,所以我的界面中提供了更改安装路径的方法。

用户修改后的路径会被传回inno setup脚本,脚本中需要做的事情如下:

1,写一个函数,来返回新的安装路径,如:

function MyDestDir(SubDir:String):String;

begin

  if SubDir = '' then

    Result := RootDestFolder

  else

    Result := RootDestFolder + '\'+ SubDir;

end; 

2,把原来使用{app}的地方都改成:{code:MyDestDir},安装脚本自己能够调用MyDestDir并得到正确的路径。如:

Source: "test.xml"; DestDir: {code:MyDestDir}; 

Source: "\res\ReloadHigh\*"; DestDir: {code:MyDestDir|res\ReloadHigh}

最后记得加上:UninstallFilesDir={code:MyDestDir}, 否则卸载程序会被放到{app}.

注意:

如果在定制后的DLL中修改安装路径,可以让inno setup把原来的路径以TCHAR*的形式传给DLL,DLL直接修改。

但因为PASCAL的String类型并非是C语言的0结尾字符串,它会记录字符串的真实长度,所以被C语言修改后的String不能直接使用。因为长度不一定相同(实际情况是如果长度没变,就是正确的,如果长度有变化,程序安装路径中的文件名就不见了,安装不了)。

所以在从DLL返回后,需要使用Length函数重新给String设置正确的长度。

Innosetup 打包安装exe 读取上次安装路径

Innosetup 打包安装exe 读取上次安装路径_c1007857613的专栏-CSDN博客_innosetup获取历史安装目录

 关于Innosetup 打包安装时读取上一次安装路径的问题网上也有挺多的文章,基本的思路就是安装时向注册表写安装路径,下次安装时从注册表读取上一次安装路径,方法如下:

[Registry]
Root:HKLM;Subkey:"Software\Myprogrom";Flags:uninsdeletekeyifempty
Root:HKLM;Subkey:"Software\Myprogrom";ValueType:string;ValueName:"InstallPath";ValueData:"{app}";Flags:uninsdeletekey

【code】

function GetDirName(Value: string): string;

var

InstallPath: string;

begin

Result := ExpandConstant('{pf}\Myprogrom');//默认

if RegQueryStringValue(HKLM, 'SOFTWARE\Myprogrom', '', InstallPath) then //注册表如果有 则读取 

Result := InstallPath;

end;

但是,有几点需要注意:

1.如果需求是每次安装前先卸载上一个版本的话,上面这个方法是获取不到路径的,因为卸载时注册表的值会被删除。那怎么办呢?思路就是卸载前获取到注册表的路径并记录下来。具体来说就是在【code】中定义一个变量var installPath; 调用卸载前从注册表获取安装路径并赋值给installPath ,然后上面的GetDirName方法直接返回installPath 即可。

2.关于注册表的坑

网上说的程序安装后的注册表路径SOFTWARE\Microsoft\Windows\CurrentVersion....  你可能会发现你的程序安装后没有在这个目录下找到,或者你往注册表写安装路径时发现在你要写的注册表目录下没有找到你写的值。这是因为64位系统的原因会从新定位到注册表其它路径下,可以看下这个篇文章:https://www.cnblogs.com/csuftzzk/p/innosetup_read_registry.html  根据我的理解把上面的HKLM改成HKLM64即可。
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值