我的应用程序是一个行为良好的Windows公民,所以当我将它移植到Windows /7时,我将我的自定义文件格式关联代码替换为对默认程序 API的支持。然而,当我试图为我的应用程序制作卸载程序时,我遇到了一个问题--似乎没有办法通过默认程序API来删除文件格式关联。
我试图调用IApplicationAssociationRegistration::ClearUserAssociations,但它实际上删除了所有关联,包括其他应用程序的关联--完全恢复操作系统的默认状态(这当然是不可接受的)。
我试图调用IApplicationAssociationRegistration::SetAppAsDefault将文件格式关联返回给以前的“所有者”--但这没有帮助,因为我的应用程序处理了许多操作系统不支持的唯一文件格式,并且没有以前的“所有者”。而且Windows不允许将空字符串传递给SetAppAsDefault.
那我该怎么办?有什么好办法吗?
发布于 2010-04-09 07:42:31
侧注意:即使您直接修改注册表中的文件关联,而不是使用默认的程序API,下面的所有注意事项也适用。
在第一次运行时,应用程序应该通过IApplicationAssociationRegistration::QueryCurrentDefault收集所有文件类型的所有者,并将它们存储在应用程序拥有的存储中。
在卸载时,应用程序应该使用IApplicationAssociationRegistration::SetAppAsDefault尝试将它仍然拥有的任何文件关联还原给它所拥有的前一个所有者。对于您的应用程序仍然拥有的关联,但不知道以前的所有者,请转到HKCR注册表并删除相应的扩展名、协议或MIME类型条目。不要碰你的应用程序不是当前所有者的任何关联--你将覆盖用户的选择。
我当然希望第一次运行时的批处理备份和卸载时的清理都是由默认的程序API作为一个API调用提供的,但是在他们决定对所有应用程序推广这种行为之前,你只能靠自己了。
请注意,应用程序在卸载时执行的清理将是针对卸载用户的。任何其他可能使用该应用程序并更改其默认值的用户都不会被清除。
您可以通过添加一个简单的每个用户任务来自动化每个用户的清理,该任务执行任务计划程序中的上述步骤。该任务将被排定为执行一次,然后从用户任务调度程序中移除自身。这种方法的唯一潜在问题是,由于您不知道将有多少用户,所以您不可能知道何时从机器中删除该任务的dll。然后,如果将dll保存在ProgramData文件夹中,这并不是什么大问题。
发布于 2010-04-03 06:27:40
我认为您使用默认程序API的方式是错误的。如果我正确理解,默认程序功能是由Microsoft添加的,因为法律要求将Internet替换为默认浏览器。它提供了比aplications使用的正常文件关联更多的功能。如果你有一个简单的文件关联注册,我建议你坚持旧的行为。
来自MSDN:默认程序(Windows)
默认程序主要用于使用标准文件类型(如.mp3或.jpg文件)或标准协议(如HTTP或mailto )的应用程序。使用自己的专有协议和文件关联的应用程序通常不使用默认程序功能。
发布于 2010-04-08 19:52:38
将文件扩展名与应用程序关联的正确代码是使用Windows注册表设置。通常,这是使用HKEY_LOCAL_MACHINE\SOFTWARE\Classes注册表单元对整个机器(不管用户)进行的,通过HKEY_CLASSES_ROOT别名(注册表快捷方式)也可以更方便地访问它。
您的过程包括三个步骤:
帮助调试和查看类(扩展)映射变化的一个工具是FileAsoc窗口文件关联编辑器。它允许您在调试应用程序时恢复文件扩展名。该网页还简要解释了如何准确地存储这些值。
希望这能有所帮助!
https://stackoverflow.com/questions/2501807
复制相似问题