gpt4 book ai didi

windows - 在先前无法加载的explorer.exe中重新加载 namespace 扩展

转载 作者:可可西里 更新时间:2023-11-01 10:32:59 25 4
gpt4 key购买 nike

背景

我的MyComputer下有一个Shell Namespace Extension(using a virtual folder as its junction point)。可以为我的 namespace 扩展创建快捷方式。在这里,我在桌面上显示了带有命名空间扩展名的扩展名。

Image showing a Namespace extension under "My Computer" in explorer with a shortcut

如果未安装我的 namespace 扩展,则安装时创建的快捷方式将无法解决。

Image showing the Namespace extension not installed and the unresolved shortcut

当我的应用程序启动时,它将我的 namespace 扩展安装到注册表中。退出时,它将从注册表中删除 namespace 扩展。这对于我的应用程序是必需的,因为加载的代表我的命名空间扩展的dll在每次运行时可能会有所不同,具体取决于配置。

问题

当我的应用程序未运行并且explorer.exe遇到我(当前未安装) namespace 扩展的快捷方式时,它尝试在注册表中查找COM组件(该快捷方式包含我的 namespace 扩展的COM标识符)。通过过程监视器。稍后,当我的应用程序启动时,我的 namespace 扩展名按预期添加在“我的电脑”下,但它无法正常工作-也就是说,尝试浏览到该应用程序(双击)无法正常进行(不执行任何操作) 。我通过Process Monitor观察发现,explorer.exe没有重新尝试加载我的命名空间扩展。似乎explorer.exe记得它无法为我的命名空间扩展加载COM组件,因此不会重试。在这种状态下的症状是:

  • 快捷方式显示为 Unresolved
  • namespace 扩展名显示在“我的电脑”下,但双击它不起作用。
  • 命名空间扩展未显示在左侧导航面板中

  • Image showing what it looks like when the namespace extension is not working

    找到这种状态后解决此问题的唯一方法是重新启动explorer.exe。

    问题

    有一种方法可以使explorer.exe一旦无法成功加载我的命名空间扩展(由于无法解决的快捷方式)而重试,而不必重新启动explorer.exe?

    一个例子

    这里是如何从头开始创建和观察问题的演练。这涉及使用称为 Shell Instance Object的“内置” Microsoft namespace 扩展(而不是我真正的 namespace 扩展)。我使用它是为了简单起见,并表明它与我的特定 namespace 扩展无关。该示例 namespace 扩展的全部作用是在“我的电脑”下创建一个图标,该图标将浏览到您的%TEMP%目录。
  • 安装 namespace 扩展并将其注册在“我的电脑”下。为此,请在注册表中输入以下内容:
    HKEY_CURRENT_USER\Software\Classes\CLSID

    {0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}=REG_SZ_EXPAND:"My Namespace Extension"
    DescriptionID=REG_DWORD:0x00000008
    System.IsPinnedToNameSpaceTree=REG_DWORD:0x00000001
    DefaultIcon=REG_EXPAND_SZ:"%SystemRoot%\system32\main.cpl,9"
    InProcServer32=REG_EXPAND_SZ:"%SystemRoot%\system32\shdocvw.dll"
    ThreadingModel=REG_SZ:"Apartment"
    ShellFolder
    Attributes=REG_DWORD:0x60000000
    Instance
    CLSID=REG_SZ:"{0AFACED1-E828-11D1-9187-B532F1E9575D}"
    InitPropertyBag
    Attributes=REG_DWORD:0x00000011
    Target=REG_SZ_EXPAND:"%TEMP%"

    这是一个.reg文件,它将为您自动化:
    Windows Registry Editor Version 5.00

    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
    @="My Namespace Extension"
    "System.IsPinnedToNameSpaceTree"=dword:00000001
    "DescriptionID"=dword:00000008

    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\DefaultIcon]
    @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
    00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,61,00,\
    69,00,6e,00,2e,00,63,00,70,00,6c,00,2c,00,39,00,00,00

    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\InProcServer32]
    @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
    00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,00,68,00,\
    64,00,6f,00,63,00,76,00,77,00,2e,00,64,00,6c,00,6c,00,00,00
    "ThreadingModel"="Apartment"

    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\Instance]
    "CLSID"="{0AFACED1-E828-11D1-9187-B532F1E9575D}"

    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\Instance\InitPropertyBag]
    "Attributes"=dword:00000011
    "Target"=hex(2):25,00,54,00,45,00,4d,00,50,00,25,00,00,00

    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\ShellFolder]
    "Attributes"=dword:60000000

    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
    @="My Namespace Extension"
  • 此时,当打开资源管理器窗口并浏览“我的电脑”时,应该看到“我的命名空间扩展名”。浏览该目录应显示您的%TEMP%目录文件夹/文件。
  • 通过将“我的命名空间扩展名”拖动到桌面上,在桌面上创建“我的命名空间扩展名”的快捷方式。
  • 从注册表中完全删除 namespace 扩展注册。您可以通过手动删除上述键或运行以下.reg文件来实现:
    Windows Registry Editor Version 5.00

    [-HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]

    [-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
  • 此时重新启动explorer.exe(或重新启动)。当explorer.exe启动时,它将尝试解析桌面上的快捷方式。这样,它将尝试将COM组件定位在HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}处,但是将无法定位。打开资源管理器窗口中的“我的电脑”,然后观察到“我的命名空间扩展”不存在。另请注意,快捷方式显示为未解决。
  • 通过重新应用步骤1中的注册表更改来重新安装 namespace 扩展。
  • 刷新“我的电脑”窗口。此时,您将处于有问题的状态,可以在“我的电脑”下看到 namespace 扩展名,但是尝试浏览它是行不通的。
  • 如果此时重新启动explorer.exe,问题将消失。这是因为当explorer.exe尝试解析快捷方式时,它能够加载 namespace 扩展COM组件,因为它当前已在注册表中注册。

  • 附加条款
  • 我真正的 namespace 扩展是用C++编写的。
  • 我正在使用SHChangeNotify来使 namespace 扩展名显示/消失在“我的电脑”下,而无需手动刷新,但这不会导致 namespace 扩展名尝试重新加载。
  • 也许令人惊讶的是,使用desktop.ini approach with .ShellClassInfo and CLSID注册的 namespace 扩展似乎没有受到此问题的困扰。不幸的是,我无法使用这种方法,因为我需要在“我的电脑”下添加 namespace 扩展名。
  • 最佳答案

    您必须仔细浏览Shell文档才能找到 SHFlushSFCache() (总是很麻烦)。

    SHFlushSFCache is called when the path to a special folder is changed. This ensures that the updated path stored in the registry is used rather than the cached value.



    不幸的是,该例程被标记为“已贬值”,但在Windows 10上似乎仍然可以使用。

    (重新)注册您的 namespace 后,调用 SHFlushSFCache();这将强制 explorer.exe 重新加载它。

    关于windows - 在先前无法加载的explorer.exe中重新加载 namespace 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43596688/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com