Inno在应用程序之间共享默认组文件夹
问题描述:
我希望用户在Windows计算机上安装第一个应用程序时能够选择“组”文件夹/目录。如果/他们选择安装其他应用程序,我希望Inno安装程序找到用户安装到的第一个“组”文件夹/目录,并将该文件夹/目录放在建议的App文件夹/目录名称的开头安装第二个应用程序。如果用户更改了“组”文件夹,那么新的组文件夹应该保存为新的“默认”组文件夹以供任何后续安装(并且安装的第一个应用程序随后位于“孤立”文件夹中)。Inno在应用程序之间共享默认组文件夹
我希望这样做的方式是与“默认安装文件夹组”的注册表项?我已经链接到一个PNG图像,希望通过例子来澄清我的问题。
答
在Inno Setup的商店所选择的 “组” 文件夹中做出
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\AppId_is1]
"Inno Setup: Icon Group"="Group"
(或者到HKEY_CURRENT_USER
如果安装程序不具有管理员权限的启动)的安装程序。
请注意,路径是特定于应用程序的(AppId
是安装程序的标识)。
因此,如果您决定使用此密钥,您将不得不扫描所有应用程序的密钥。而且你不知道最后一次安装了哪个应用程序。
所以我相信你应该创建自己的注册表项来存储组。
要保存选定的组,你可以用一个标准的Inno Setup的做[Registry]
部分:
[Registry]
Root: HKLM; Subkey: "Software\My Company"; ValueType: string; \
ValueName: "GlobalGroup"; ValueData: "{groupname}"
虽然加载它,你必须对它进行脚本:
[Code]
procedure InitializeWizard();
var
GlobalGroup: string;
begin
if RegQueryStringValue(
HKEY_LOCAL_MACHINE, 'Software\My Company', 'GlobalGroup', GlobalGroup) then
begin
Log('Global group found: ' + GlobalGroup);
WizardForm.GroupEdit.Text := GlobalGroup;
end
else
begin
Log('Global group not found');
end;
end;
注卸载所有应用程序时,注册表项不会被删除。所以全球集团在全球的卸载中幸存下来。如果这是一个问题,你将不得不实施一个引用计数器来处理这个问题。
如果我理解正确,你实际上只共享组名(第一级目录?)的一部分。因此,您在选择注册表中的内容时可能需要一些逻辑。在这种情况下,您最好使用脚本储存:
procedure CurStepChanged(CurStep: TSetupStep);
var
GlobalGroup: string;
begin
if CurStep = ssDone then
begin
GlobalGroup := ExpandConstant('{groupname}');
Log('Saving global group: ' + GlobalGroup);
if RegWriteStringValue(HKEY_LOCAL_MACHINE, 'Software\My Company', 'GlobalGroup', GlobalGroup) then
begin
Log('Global group saved');
end
else
begin
Log('Error saving global group');
end;
end;
end;
谢谢马丁。我会尝试一下你的建议,虽然它可能需要一些思考,因为我目前有一个InitializeWizard()函数,并通过一个对话框询问用户安装目录。因此,我必须首先去掉他们选择的任何目录的“路径”,将其保存到“GlobalGroup”注册表项(或者将其替换,如果存在)...对吗? – Arty
不客气。虽然在StackOverflow我们[感谢接受和/或upvoting的答案](http://stackoverflow.com/help/someone-answers)。 –
关于你的问题:是的。我添加了更多的代码,您可能需要。 –