我的应用程序是一个表现相当好的Windows公民,因此当我将其移植到Windows Vista / 7时,我替换了我的自定义文件格式关联代码,并支持Default Programs API。但是在尝试为我的应用程序创建卸载程序时遇到了问题 - 似乎无法通过默认程序 API 删除文件格式关联。
我试图调用IApplicationAssociationRegistration :: ClearUserAssociations但它实际上删除了所有关联,包括其他应用程序的关联 - 完全恢复操作系统的默认状态(这当然是不可接受的)。
我试图调用IApplicationAssociationRegistration::SetAppAsDefault将文件格式关联返回给前一个“所有者” - 但它没有帮助,因为我的应用程序处理许多独特的文件格式,操作系统不支持并且之前没有“拥有者”。并且Windows不允许将空字符串传递给SetAppAsDefault ...
那我该怎么办?有什么好的解决方案吗?
答案 0 :(得分:1)
我认为您以错误的方式使用默认程序 API。如果我理解正确,由于法律要求将Internet Explorer替换为默认浏览器,Microsoft已添加默认程序功能。它提供了另一组功能,而不是应用程序使用的普通文件关联。如果你只有一个简单的文件关联来注册,我建议你坚持旧的行为。
来自MSDN:Default Programs (Windows):
默认程序 主要用于使用标准文件类型的应用程序,如.mp3或.jpg文件或标准协议,如HTTP或mailto。使用自己的专有协议和文件关联的应用程序通常不使用默认程序功能。
答案 1 :(得分:0)
将文件扩展名与应用程序相关联的正确代码是使用Windows注册表设置。通常,这是使用HKEY_LOCAL_MACHINE\SOFTWARE\Classes
注册表配置单元对整个计算机(无论用户)进行的,通过HKEY_CLASSES_ROOT
别名(注册表快捷方式)也可以更方便地访问它。
您的流程包含三个步骤:
在安装应用程序之前保存“旧”设置(顺便说一句,这样做很好。许多应用程序只是完全删除映射!)
创建自己的关联。关于如何执行此操作的一个很好的示例是Modifying File Associations With Registry Editor。有关MSDN的详尽解释:
卸载时,从步骤(1)恢复已保存的“旧”设置,并使用这些原始值重写已安装的值。如果没有“旧”设置,良好的公民身份意味着只需从注册表中完全删除类密钥。
帮助调试和查看类(扩展)映射如何更改的一个工具是FileAsoc Windows File Association Editor。它允许您在调试应用程序时恢复文件扩展名。该网页还简要说明了值的存储方式。
希望这有帮助!
答案 2 :(得分:0)
旁注:即使您直接修改注册表中的文件关联而不是使用默认程序API,以下所有注意事项也适用。
首次运行时,您的应用程序应通过IApplicationAssociationRegistration::QueryCurrentDefault
收集所有文件类型的所有文件类型的所有者,并将其存储在您的应用程序所拥有的存储空间中。
在卸载时,您的应用程序应使用IApplicationAssociationRegistration::SetAppAsDefault
尝试将其仍拥有的任何文件关联恢复到其拥有的前任所有者。对于您的应用仍然拥有的关联,但不知道以前的所有者,请转到HKCR
注册表并删除相应的扩展名,协议或MIME类型条目。不要触摸您的应用程序不是当前所有者的任何关联 - 您将覆盖用户的选择。
我当然希望第一次运行时的批量备份和卸载时的清理是由Default Programs API作为单个API调用提供的,但在他们决定对所有应用程序进行一般化处理之前,您就在自己的。
请注意,应用程序在卸载时执行的清理将特定于卸载用户。任何其他可能已使用该应用程序并更改其默认值的用户都将无法清除。
您可以通过添加一个简单的每用户任务来自动执行每个用户的清理,该任务执行任务计划程序中的上述步骤。该任务将被安排执行一次,然后从用户任务调度程序中删除自己。该方法唯一的潜在问题是,由于您不知道将有多少用户,因此您无法知道何时从该计算机中删除该任务的dll。再说一遍,如果你将这个dll留在ProgramData文件夹中,那就不是什么大问题了。
答案 3 :(得分:0)
不要在应用中创建文件关联,而是在安装程序中创建它们。使用WiX,您可以创建一个安装程序,在安装时设置文件关联,并在卸载时将其删除