4

我的应用程序是一个行为良好的 Windows 公民,因此当我将其移植到 Windows Vista/7 时,我将自定义文件格式关联代码替换为对默认程序API 的支持。但是,我在尝试为我的应用程序制作卸载程序时遇到了一个问题——似乎无法通过默认程序API删除文件格式关联。

我试图调用 IApplicationAssociationRegistration::ClearUserAssociations 但它实际上删除了所有关联,包括其他应用程序的关联 - 完全恢复操作系统的默认状态(这当然是不可接受的)。

我尝试调用IApplicationAssociationRegistration::SetAppAsDefault将文件格式关联返回给以前的“所有者”——但这没有帮助,因为我的应用程序处理了许多操作系统不支持的独特文件格式,并且没有以前的“所有者”。并且 Windows 不允许将空字符串传递给 SetAppAsDefault...

那我该怎么办?有什么好的解决办法吗?

4

4 回答 4

1

我认为您以错误的方式使用默认程序API。如果我理解正确,Microsoft 添加了默认程序功能,因为法律要求将 Internet Explorer 替换为默认浏览器。它提供了不同于应用程序使用的普通文件关联的另一组功能。如果您只有一个简单的文件关联来注册,我建议您坚持旧的行为。

来自MSDN:默认程序 (Windows)
默认程序主要是为使用标准文件类型(如 .mp3 或 .jpg 文件)或标准协议(如 HTTP 或 mailto)的应用程序设计的。使用自己的专有协议和文件关联的应用程序通常不使用默认程序功能。

于 2010-04-03T06:27:40.767 回答
0

将文件扩展名与应用程序关联的正确代码是使用 Windows 注册表设置。通常这是使用HKEY_LOCAL_MACHINE\SOFTWARE\Classes注册表配置单元对整个机器(无论用户如何)完成的,也可以通过HKEY_CLASSES_ROOT别名(注册表快捷方式)更方便地访问。

您的过程涉及三个步骤:

  1. 在安装您的应用程序之前保存“旧”设置(顺便说一句,您这样做很好。许多应用程序只是完全删除了映射!)

  2. 创建自己的关联。如何执行此操作的一个很好的示例是使用注册表编辑器修改文件关联。MSDN上有详尽的解释:

  3. 卸载时,从步骤 (1) 中恢复保存的“旧”设置,并用这些原始值重写已安装的值。如果没有“旧”设置,良好的公民身份将意味着从注册表中完全删除类键。

FileAsoc Windows File Association Editor是帮助调试和查看类(扩展)映射如何变化的一种工具。它允许您在调试应用程序时恢复文件扩展名。该网页还简要说明了这些值是如何存储的。

希望这可以帮助!

于 2010-04-08T19:52:38.920 回答
0

旁注:即使您直接修改注册表中的文件关联而不是使用默认程序 API,以下所有注意事项也适用。

在第一次运行时,您的应用程序应该收集存在的所有文件类型的先前所有者,通过IApplicationAssociationRegistration::QueryCurrentDefault并将它们存储在您的应用程序拥有的存储中。

在卸载时,您的应用程序应该使用它IApplicationAssociationRegistration::SetAppAsDefault来尝试将它仍然拥有的任何文件关联恢复到它拥有的先前所有者。对于您的应用仍然拥有但不知道以前的所有者的关联,请转到HKCR注册表并删除相应的扩展、协议或 MIME 类型条目。不要触摸您的应用不是当前所有者的任何关联 - 您将覆盖用户的选择。

我当然希望默认程序 API 将首次运行时的批量备份和卸载时的清理作为单个 API 调用提供,但在他们决定为所有应用程序推广该行为之前,您只能靠自己了。

请注意,您的应用程序在卸载时执行的清理将特定于卸载用户。任何其他可能使用过该应用程序并更改其默认设置的用户都不会被清除。

您可以通过在任务计划程序中添加执行上述步骤的简单的每用户任务来为每个用户自动清理。该任务将被安排执行一次,然后将其自身从用户任务调度程序中删除。这种方法的唯一潜在问题是,由于您不知道会有多少用户,因此您不可能知道何时从机器上删除该任务的 dll。再说一次,如果您将该 dll 留在 ProgramData 文件夹中,这没什么大不了的。

于 2010-04-09T07:42:31.700 回答
0

Instead of making the file associations in your app, make them in the installer. Using WiX you can create an installer that sets file associations on install and will remove them on uninstall

于 2010-04-09T10:45:19.683 回答