1

我一直在研究“现代 Windows c++ 应用程序应如何注册其文件类型”与 Windows(请参阅C++:如何为我们的应用程序正确注册和注销文件类型关联(以编程方式))。

在梳理了有关该主题的各种 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-installer 负责删除所有已注册的 ProgID(但应该不理会实际的文件关联,因为 Windows 足够聪明,可以处理指向丢失 ProgID 的关联,这是 MSDN 指定的所需行为)。

因此,该架构对我来说听起来很合理,除非我考虑 #4:为给定用户帐户运行提升的卸载程序如何删除在步骤 #3 中为其他用户创建的任何每个用户 ProgID?

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

感谢您提供的任何见解!

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

4

2 回答 2

1

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

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

于 2010-05-17T15:10:19.387 回答
1

我刚刚意识到:MS 希望我们做的是让每个用户覆盖文件映射本身 - 即 .foo -> 什么?不创建任何 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 点的个人副本是否有效,无论哪种方式,微软都会处理它。

我希望这对其他人有帮助...

于 2010-05-19T14:27:29.607 回答