今天需要给之前打包的一个软件制作补丁的安装程序,因为当时并没有考虑到这个小软件会做补丁安装程序,所以当时并没有在注册表中记录这个软件的安装位置,不过幸好在环境变量中记录了与这个软件一起使用的数据库的位置(数据库与该软件在同一个目录下),所以将这个环境变量处理一下就可以得到之前软件的安装目录,具体步骤如下:
1. 首先在INNO Setup的[Setup]中添加DisableDirPage=yes,此处设定是不允许用户在安装补丁时擅自修改安装目录。
2. 将[Setup]中DefaultDirName={pf}\{#MyAppName}改为DefaultDirName={code:GetPath},将安装目录由用户指定改为系统自动设定。
3. 在[Code]中添加代码如下:
//字符串拆分
procedure SeparateTerms(s: string; Separator: char; Terms: TStringList);
var
hs : string;
p : integer;
begin
Terms.Clear; // First remove all remaining terms
if Length(s)=0 then // Nothin'' to separate
Exit;
p:=Pos(Separator,s);
while P<>0 do
begin
hs:=Copy(s,1,p-1); // Copy term
Terms.Add(hs); // Add to list
Delete(s,1,p); // Remove term and separator
p:=Pos(Separator,s); // Search next separator
end;
if Length(s)>0 then
Terms.Add(s); // Add remaining term
end;
//获取系统安装路径
function GetPath(Param: String): String;
var
strPath: String;
Terms: TStringList;
x,i : integer;
begin
//取到想要的环境变量值
RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', strPath);
strPath := Trim(strPath);
//拆分Path
Terms:=TStringList.Create;
SeparateTerms(strPath,';',Terms);
for i:=0 to Terms.Count-1 do
begin
x := pos('/dbmaster;',Terms.Strings[i]);
if x>0 then
begin
strPath := Terms.Strings[i];
Delete(strPath,x,10);
end;
end;
Terms.Free;
Result := strPath;
end;
如果之前有在注册表中记录系统的安装路径,就要简单的多,只需要[Setup]中添加DisableDirPage=yes,并将DefaultDirName={pf}\{#MyAppName}改为DefaultDirName={reg:HKLM/SOFTWARE/LACJXT,InstallLocation}-- (从注册表读取系统的实际安装路径)就可以了。