Inno Setup:删除另一个程序留下的问题注册表项

5
我正在使用Inno Setup为我的程序撰写安装程序。我的程序使用网页和Internet Explorer进行交互。
我的一些查询需要超过10秒钟的时间,我注意到我的朋友的电脑上有一个名为“RequestTimeout”的注册表键,用于设置Internet Explorer的超时时间为10秒钟。这个键在Internet Explorer上并不自然存在,显然是由第三方安装程序添加的。但从我在网上读到的内容来看,很多人最终都会得到它。
我的问题是,在安装期间,我能告诉Inno Setup删除或修改这个键吗?
我已经搜索过所有关于Inno Setup和注册表键的资源,但都与卸载选项有关。

3
如果您删除不属于您的条目,可能会影响系统中的其他部分。如果它们不是您的,请不要碰它们。 - Ken White
我同意@Ken所说的。至少公平的做法是创建一个页面,询问用户对可选密钥想要执行什么操作(例如,仅当其值设置为低值时)。不管怎样,那个键是什么?我只找到了关于ReceiveTimeout的信息,没有关于RequestTimeout的信息。 - TLama
1
你想要一个页面,告诉用户有短连接超时和修改(或删除)注册表值的一些选项以降低应用风险吗?(只有在找到并且该注册表值很低的情况下才会显示此页面)。或者你是想直接删除该值而不提供任何选项呢?用户可能手动设置该值,因此如果我是你,我宁愿选择选项页面。有些人可能会将直接删除视为恶意行为。你更喜欢哪个? - TLama
我同意评论中的观点,但是这篇关于SO的帖子:https://dev59.com/wnE85IYBdhLWcg3wwWUb 解释了我的意思。这个密钥实际上是其他安装程序的剩余物,它们不会打扫干净自己的后院。TLama提出了理想的解决方案,虽然我想给他们选择的机会,但我相信我的应用程序的目标受众对注册表键没有什么头绪。 - Juicy
我在考虑一个页面像这样,但也许它太详细了。我不知道如何设计这样的页面。没有任何选项就修改或删除它是不公平的,对你的应用程序也是不公平的。而且向用户解释也相当困难。只有在找到注册表值并且有值时才会显示此页面,比如说10秒钟。第一个选项(它们可以交换)将保留设置,第二个选项将删除密钥,第三个选项将允许输入自定义值(这相当危险)。 - TLama
@Juicy:你做出了这个键是残留物的假设。然而,我非常怀疑微软在Windows simmpy中实现它是供安装程序使用(并被忽视和遗留)的,因此它显然有其他非安装原因存在。你不能认为那篇单一的SO帖子就是关于那个键100%的信息,也不能认为行为不端的安装程序是它存在的唯一原因。你会发现自己以艰难的方式搞砸了别人的系统,这往往会惹恼人们。再次强调:那不属于你,请把它放下。 :-) - Ken White
3个回答

11

忽略是否应该删除一个不属于你的值的问题,你可以通过将类型设置为none并添加deletevalue标志来轻松地在安装时删除注册表值:

[Registry]
Root: HKLM; Subkey: "Software\My Company\My Program\Settings"; ValueName: "Value"; ValueType: none; Flags: deletevalue;

您还可以添加一个检查:参数和其他条件语句。


4
为了完整性: Inno Setup默认是一个32位应用程序。因此,默认情况下,即使在64位体系结构上,它也会删除32位注册表键。要删除64位键,您必须使用64位常量(例如 Root: HKLM64 用于HKey_Local_Machine)。
更多信息请参见:在安装结束时编写32/64位特定的注册表键

2
在inno setup帮助文档中列出了一些函数,您可以使用这些函数来实现此功能。
function RegDeleteKeyIncludingSubkeys(const RootKey: Integer; const SubkeyName: String): Boolean;
function RegDeleteKeyIfEmpty(const RootKey: Integer; const SubkeyName: String): Boolean;
function RegDeleteValue(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;;

您可以在initializeWizard或initializeSetup方法中进行操作,检查值并修改它们。同时,您问题下方的评论是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接