转自: 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即可。