代码之家  ›  专栏  ›  技术社区  ›  Mordachai

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

  •  1
  • Mordachai  · 技术社区  · 16 年前

    我一直在研究“现代WindowsC++应用程序应该如何在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. 运行standard(未升级)的应用程序应提供一个UI,允许当前用户将其个人关联设置为安装程序中的可用关联,但这些关联存储在HKCU\Software\Classes(每个用户,而不是每台计算机)中。
    4. 然后,uninstaller负责删除所有注册的progid(但是应该保留实际的文件关联,因为Windows足够聪明,可以处理指向丢失progid的关联,这是MSDN指定的所需行为)。

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

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

    感谢您提供的任何见解!

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

    2 回复  |  直到 9 年前
        1
  •  1
  •   Thomas    16 年前

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

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

        2
  •  1
  •   Mordachai    16 年前

    我刚刚意识到:微软希望我们做的是让每个用户覆盖文件映射本身,即.foo->什么?不创建任何ProgID,它应该只由安装程序创建,由卸载程序删除,所以没有“悬挂ProgID”-只有“悬挂文件映射”映射到丢失的ProgID,MS明确表示是可以的。

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

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

    用户决定将.txt文件映射到TextPad:

    卸载后: HKCR\.txt x->HKCR\MyEditor.text.1(全局,但密钥HKCR\MyEditor.txt.1已被删除)

    另外,有一个用户重写了它们的值,这仍然是正常的,因为不管他们的.txt点的单个副本是有效的还是无效的,微软都会处理它。

    推荐文章