2011-04-19 98 views
2

我之前在Inno Setup中的安装(A)有AppID = {{8ADA0E54-F327-4717-85A9-9DE3F8A6D100}。如何为以前的Inno Setup安装自动设置DefaultDirName?

我有另一个安装(B)与不同的AppID,我想安装到安装(A)相同的目录中。

如何自动获得DefaultDirName?我不想使用相同的AppID,因为当我卸载安装(B)并且安装(A)保持安装时,它将从注册表(安装(A)字符串)中删除AppID字符串。

你能帮助我吗?

+0

我认为这属于超级用户,是吧? – Bastardo 2011-04-19 17:53:19

+0

你确实应该为同一个应用程序保留相同的AppID。如果你这样做,Inno会为你做剩下的事情。 – Deanna 2012-10-12 16:21:12

回答

6

你可能需要一些代码来做你想做的。您还需要一种方法来发现应用A的安装目录下面是我用

[Setup] 
DefaultDirName={code:GetDefaultDir} 

[Code] 
function GetDefaultDir(def: string): string; 
var 
sTemp : string; 
begin 
    //Set a defualt value so that the install doesn't fail. 
    sTemp := ExpandConstant('{pf}') + '\MyCompany\MyAppA'; 

    //We need to get the current install directory. 
    if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\MyCompany\Products\MyAppNameA', 
    'InstallDir', sTemp) then 
    begin 
    //We found the value in the registry so we'll use that. Otherwise we use the default 
    end; 
    Result := sTemp; 
end; 
+0

这只有在以前的设置记录了这样的密钥时才有效。如果没有,可以查询以前安装的AppID的Inno Setup:App Path值。关键是“HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Uninstall \'+ AppID +'_ is1''。没有太大的区别,所以+1。 – 2011-04-19 21:05:47

+0

谢谢,伙计们。我明天会试一下,让你知道。 – Jiri 2011-04-19 21:45:17

+0

我试过这段代码,它不起作用 [code] function GetDefaultDir(def:string):string; var sTemp:string; 开始 //设置一个默认值,以便安装不会失败。 sTemp:= ExpandConstant('C:'); //我们需要获取当前的安装目录。 如果RegQueryStringValue(HKEY_LOCAL_MACHINE, '软件\微软\的Windows \ CurrentVersion \卸载\ {8ADA0E54-F327-4717-85A9-9DE3F8A6D100} _is1', 'INSTALLDIR',STEMP)然后 开始 //我们发现价值注册表,所以我们将使用它。否则我们使用默认的 结束; 结果:= sTemp; 结束; – Jiri 2011-04-20 08:16:08

4

我制定了以下的代码基础上找到的AppID安装目录中的一些代码。它适用于每个用户的注册表项以及整个机器的注册表项。它已经在域上和虚拟PC XP Professional机器上的Windows 7 Enterprise上进行了测试:

[code] 
const 
    PreviousAppID = '8ADA0E54-F327-4717-85A9-9DE3F8A6D100'; 
    AppFolder  = 'SomeFolder'; 

    UninstallPath = 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{' 
        + PreviousAppID + '}_is1'; 

    // Some posts have 'InstallDir', but I have never observed that 
    InstallKey = 'InstallLocation'; 

function GetDefaultDir(Param: String) : String; 
var 
    UserSIDs: TArrayOfString; 
    I:  Integer; 

begin 
    // Check if the current user installed it 
    if RegQueryStringValue(HKEY_CURRENT_USER, UninstallPath, 
          InstallKey, Result) then 

    // Current user didn't install it. Did someone else? 
    else if RegGetSubkeyNames(HKEY_USERS, '', UserSIDs) then begin 
     for I := 0 to GetArrayLength(UserSIDs) - 1 do begin 
     if RegQueryStringValue(HKEY_USERS, UserSIDs[I] + '\' + UninstallPath, 
           InstallKey, Result) then break; 
     end; 
    end; 

    // Not installed per-user 
    if Result = '' then begin 
     // What about installed for the machine? 
     if RegQueryStringValue(HKEY_LOCAL_MACHINE, UninstallPath, 
           InstallKey, Result) then 

     // Doesn't appear to be installed, as admin default to Program Files 
     else if IsAdminLoggedOn() then begin 
     Result := ExpandConstant('{pf}\') + AppFolder; 

     // As non-admin, default to Local Application Data 
     end else begin 
     Result := ExpandConstant('{localappdata}\') + AppFolder; 
     end; 
    end; 
end; 
+0

所有在Windows 10中都很好。谢谢! :) – 2018-01-20 14:26:58

相关问题