Winapi Windows Vista、默认程序API、文件格式关联和(联合国)安装程序-爆炸性混合!

Winapi Windows Vista、默认程序API、文件格式关联和(联合国)安装程序-爆炸性混合!,winapi,windows-7,windows-vista,uninstallation,default-programs,Winapi,Windows 7,Windows Vista,Uninstallation,Default Programs,我的应用程序是一个行为良好的Windows公民,因此当我将其移植到Windows Vista/7时,我用对API的支持替换了我的自定义文件格式关联代码。然而,我在尝试为我的应用程序制作卸载程序时遇到了一个问题-似乎没有办法通过默认程序API删除文件格式关联 我试图调用IApplicationAssociationRegistration::ClearUserAssociations,但它实际上删除了所有关联,包括其他应用程序的关联——完全恢复操作系统的默认状态(这当然是不可接受的) 我试图调用将

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

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

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


那我该怎么办?有好的解决方案吗?

我认为您使用默认程序API的方式不对。如果我理解正确,默认程序功能是由Microsoft根据法律要求添加的,以取代Internet Explorer作为默认浏览器。它提供了与应用程序使用的普通文件关联不同的另一组功能。如果您只需要注册一个简单的文件关联,我建议您坚持旧的行为

发件人:

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

将文件扩展名与应用程序关联的正确代码是使用Windows注册表设置。通常使用
HKEY\U LOCAL\U machine\SOFTWARE\Classes
注册表配置单元对整个机器(无论用户)执行此操作,也可以通过
HKEY\U Classes\U ROOT
别名(注册表快捷方式)更方便地访问此配置单元

您的流程包括三个步骤:

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

  • 创建自己的关联。关于如何执行此操作的一个很好的示例是。MSDN上有详细说明:

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

  • 有一个工具可以帮助调试和查看类(扩展)映射的变化。它允许您在调试应用程序时恢复文件扩展名。该网页还简要说明了如何准确存储这些值


    希望这有帮助

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

    在第一次运行时,您的应用程序应通过收集所有文件类型的以前所有者,并将其存储在应用程序拥有的存储中

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

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

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


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

    不要在你的应用程序中建立文件关联,而是在安装程序中建立它们。使用,您可以创建一个安装程序,在安装时设置文件关联,并在卸载时删除这些关联

    这就是我的WindowsXP代码的工作方式(这不是我要问的)。我的软件同时注册标准文件类型(JPEG、GIF、PNG、TIFF)和非标准文件类型(SVG、JPEG2000、40+其他)-所以我想使用默认程序来管理所有这些。另外,我看到很多软件(例如Foobar2000或Media Player Classic Home Cinema)最近开始使用默认程序API来管理所有关联,包括非标准关联。所以我还不知道该怎么办…不幸的是,这不是一个选项,因为我应该给用户在安装后更改关联的选项(并且有能力添加插件,安装程序无论如何也不会知道所有扩展)。谢谢!我打算这样做(希望微软能在Windows8中添加缺失的部分)。