jjzjj

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

coder 2024-06-12 原文

背景

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



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



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

问题

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

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



  • 找到这种状态后解决此问题的唯一方法是重新启动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/

    有关windows - 在先前无法加载的explorer.exe中重新加载 namespace 扩展的更多相关文章

    1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

      我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

    3. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

      我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

    4. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

      exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

    6. ruby - 无法运行 Rails 2.x 应用程序 - 2

      我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

    7. ruby - 如何在续集中重新加载表模式? - 2

      鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

    8. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

      我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

    9. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

      我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

    10. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

      我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

    随机推荐