从Windows卸载时如何从其他用户帐户中删除ProgID?

时间:2010-05-17 15:03:05

标签: c++ winapi windows-shell file-type

我一直在研究“现代windows c ++应用程序应如何在Windows中注册其文件类型”(请参阅​​C++: How do I correctly register and unregister file type associations for our application (programatically))。

在梳理了有关该主题的各种MSDN文章后,摘要出现如下:

  1. 安装程序(已提升)应注册全局ProgID HKLM \ Software \ Classes \ my-app.my-doc [.version](例如HKLM \ Software \ Classes \ TextPad.text)
  2. 安装程序还为其文档类型(例如.myext)配置默认关联,并将其指向HKLM中的上述全局ProgID。
    注意:此处应提供用户界面,以允许用户接受所有默认关联,或自定义应设置的关联。
  3. 运行标准(未提升)的应用程序应该提供一个UI,允许当前用户设置安装程序中可用的个人关联,除了这些关联存储在HKCU \ Software \ Classes中(每个用户,不是每台机器)。
  4. 然后UN安装程序负责删除所有已注册的ProgID(但应该单独保留实际的文件关联,因为Windows足够聪明,可以处理指向缺少ProgID的关联,这是MSDN指定的所需行为)。 / LI>

    所以这个模式对我来说听起来很合理,除非我考虑#4:对于给定用户帐户运行升级的卸载程序如何删除在步骤#3中为其他用户创建的每个用户的ProgID?

    据我所知,即使在提升模式下,卸载程序也无法进入其他用户的注册表配置单元并删除项目?或者可以吗?是否必须先加载每个给定的用户配置单元?这里的规则是什么?

    感谢您提供的任何见解!

    编辑:请参阅下面的解决方案(我的问题是在混乱中建立的)

2 个答案:

答案 0 :(得分:1)

据我所知,其他用户帐户中的设置通常只是留在那里。这不仅限于文件类型关联。

从所有用户帐户中删除设置几乎是不可能的,因为有些可能是当前未连接的域上的漫游配置文件,或者本地管理员无权访问。

答案 1 :(得分:1)

我刚刚意识到:MS希望我们做的是让每个用户覆盖文件映射本身 - 即.foo - >什么?不要创建任何只能由安装程序创建的progID,这些progID由卸载程序删除,因此没有“悬挂的ProgID” - 只有“悬空文件映射”映射到缺少的ProgID,MS明确指出是正常的。

安装前: HKCR \ .txt - > HKCR \ txtfile(全球)

安装后: HKCR \ .txt - > HKCR \ MyEditor.text.1(全球)

用户决定将.txt文件映射到TextPad: HKCU \ Software \ Classes \ .txt - > HKCR \ TextPad.txt(仅限此用户,全球仍为.txt-> MyEditor.text.1)

卸载后: HKCR \ .txt x-> HKCR \ MyEditor.text.1(全球,但关键HKCR \ MyEditor.txt.1已被删除)

一个超出价值的用户仍然可以,因为无论他们的.txt点的个人副本是否有效,无论哪种方式,Microsoft都会处理它。

我希望能帮助别人......