Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inno setup 如何为以前的Inno安装程序自动设置DefaultDirName?_Inno Setup - Fatal编程技术网

Inno setup 如何为以前的Inno安装程序自动设置DefaultDirName?

Inno setup 如何为以前的Inno安装程序自动设置DefaultDirName?,inno-setup,Inno Setup,我以前在Inno安装程序中的安装(A)的AppID={{8ADA0E54-F327-4717-85A9-9DE3F8A6D100} 我有另一个具有不同AppID的安装(B),我想将其安装到与安装(A)相同的目录中 如何自动获取DefaultDirName?我不想使用相同的AppID,因为当我卸载安装(B)并且安装(A)保持安装时,它将从注册表中删除AppID字符串(安装(A)字符串) 您能帮助我吗?您可能需要一些代码来完成您想要的操作。您还需要一种方法来查找应用程序a的安装目录。以下是我使用的一

我以前在Inno安装程序中的安装(A)的AppID={{8ADA0E54-F327-4717-85A9-9DE3F8A6D100}

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

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


您能帮助我吗?

您可能需要一些代码来完成您想要的操作。您还需要一种方法来查找应用程序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;

我开发了以下代码以基于AppID查找安装目录。它包含每个用户的注册表项以及整个计算机的注册表项。它已在Windows 7 Enterprise上的域和虚拟PC XP Professional计算机上进行了测试:

[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;

我认为这属于超级用户,是吗?你真的应该为同一个应用程序保留相同的AppID。如果你这样做,Inno将为你做其余的事情。这只有在以前的安装程序记录了这样一个密钥的情况下才会起作用。如果没有,可以查询以前安装的AppID以获得
“Inno setup:App Path
值。密钥将是
”HKLM\software\Microsoft\Windows\CurrentVersion\Uninstall\'+AppID+“\u is1'
。没有太大区别,所以+1。谢谢你们,伙计们。我明天会试试,让你们知道。我试过这段代码,但[code]函数GetDefaultDir(def:string)不起作用:string;var sTemp:string;begin//设置一个解除值,以便安装不会失败。sTemp:=ExpandConstant('C:');//我们需要获取当前安装目录。如果RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\{8ADA0E54-F327-4717-85A9-9DE3F8A6D100}_is1'、'安装目录'、sTemp)然后开始//我们在注册表中找到了值,所以我们将使用它。否则我们将使用默认的end;Result:=sTemp;end;很抱歉上面的帖子,我不知道如何在这里使用标记。我正在运行Win7 64位,AppID的字符串是:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{8ADA0E54-F327-4717-85A9-9DE3F8A6D100}我找到了另一个代码,但它不起作用[code]函数GetInstallDirectory(S:String):String;var installDirectory:String;begin if RegQueryStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall','{8ADA0E54-F327-4717-85A9-9DE3F8A6D100}_is1',installDirectory),然后//成功读取值结果:=installDirectory否则//读取值结果失败:=ExpandConstant('C:');结束;