以前

2

背景

私はマイコンピュータの下に(using a virtual folder as its junction point)に配置されShell Namespace Extensionを持つロードに失敗しましたexplorer.exeの中に名前空間拡張をリロードします。私の名前空間拡張へのショートカットを作成することは可能です。ここでは、デスクトップ上にショートカットを持つ名前空間の拡張子を示します。以前

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

私の名前空間拡張ががインストールされていない場合は、予想通り、それをインストールしたときに、私が作成したショートカットが未解決になります。

Image showing the Namespace extension not installed and the unresolved shortcut

私のアプリケーションが起動すると、それはレジストリに私の名前空間拡張をインストールします。終了すると、レジストリから名前空間拡張が削除されます。これは、私のアプリケーションには必要です。なぜなら、ネームスペース拡張を表すためにロードされたdllは、設定に応じて実行ごとに異なるかもしれないからです。

私のアプリケーションがないランニングであり、explorer.exeのが私の(現在インストールされていない)名前空間拡張へのショートカットを検出すると、それは(ショートカットが含まれているCOMコンポーネントのレジストリで検索しよう

問題私の名前空間拡張のCOM識別子) - 私はこれをプロセスモニタで観察しました。私のアプリケーションが起動すると、私の名前空間拡張子が "マイコンピュータ"の下に追加されますが、それは機能しません。つまり、ブラウズしようとすると(ダブルクリック) 。 Process Monitor経由で私の所見は、explorer.exeが私の名前空間拡張を読み込もうとしなかったことを示しています。 explorer.exeが、名前空間拡張のCOMコンポーネントを読み込めなかったことを覚えているようだから、再試行はしません。この状態の症状がある:ショートカットが名前空間拡張は、マイコンピュータの下に示しているが、それをダブルクリックが機能しない

  • として未解決現れ

    • 名前空間拡張がないは私がこの状態にいるよ一度問題を解決するために見つけた唯一の方法は、再起動することで、左側のナビゲーションパネル

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

    に表示されませんexplorer.exe。

    質問

    それは既に一度それをロードするために失敗した後に私の名前空間拡張をロードするために再試行するexplorer.exeを取得する方法のexplorer.exeを再起動せずに(が原因未解決のショートカットに)あります?

    アン例

    ここでは、最初から問題を作成し、観察する方法の散歩です。これには、私の実際の名前空間拡張ではなく、Shell Instance Objectと呼ばれるMicrosoftの名前空間拡張機能が組み込まれています。私は、これを私の特定の名前空間拡張に関連していないことを示すだけでなく、簡単にするために使用しました。このサンプルネームスペースの拡張機能はすべて、 "マイコンピュータ"の下に%TEMP%ディレクトリを参照するアイコンを作成します。

    1. 名前空間拡張をインストールし、[マイコンピュータ]に登録します。これを行うには、レジストリに次のように入力します。ここでは

      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" 
      
    2. と「My Computer」をナビゲートすると、「My Namespace Extension」が表示されます。ブラウズすると、%TEMP%ディレクトリのフォルダ/ファイルが表示されます。

    3. "My Namespace Extension"をデスクトップにドラッグして、デスクトップ上のショートカットを "My Namespace Extension"に作成します。

    4. レジストリから名前空間拡張の登録を完全に削除します。

      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}] 
      
    5. 再起動は、この時点でEXPLORE.EXE(または再起動を行う):手動で上記のキーを削除するか、次の.regファイルを実行していることを行うことができます。 explorer.exeが起動すると、デスクトップ上のショートカットを解決しようとします。これを行うと、COMコンポーネントをHKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}に配置しようとしますが、COMコンポーネントを見つけることはできません。エクスプローラウィンドウを開いて「マイコンピュータ」を開き、「My Namespace Extension」が存在しないことを確認します。また、ショートカットが未解決として表示されます。

    6. あなたの「マイコンピュータ」ウィンドウを更新し、ステップ1

    7. からレジストリの変更を再適用することによって、名前空間拡張を再インストールします。この時点では、「マイコンピュータ」の名前空間拡張子が表示される問題のある状態になりますが、ブラウズしようとすると機能しません。

    8. この時点でexplorer.exeを再起動すると、問題は解決します。 explorer.exeがショートカットを解決しようとすると、現在レジストリに登録されているため、名前空間拡張COMコンポーネントを読み込むことができるからです。

    その他の注意事項

    • 私の本当の名前空間拡張はC++で書かれています。

    • 私はSHChangeNotifyを使用して、手動での更新を必要とせずに「マイコンピュータ」の下に表示されたり消えるようにしていますが、名前空間拡張がリロードを試みることはありません。

    • おそらく驚くべきことに、desktop.ini approach with .ShellClassInfo and CLSIDを使用して登録された名前空間拡張は、この問題を抱えていないようです。残念ながら、私の名前空間の拡張子を "マイコンピュータ"の下に置く必要があるので、このアプローチを使用することはできません。

  • +0

    私たちが** C++ **タグでこれらのような質問を書くことができれば! (まあ、複雑ではありませんが、このレベルの詳細があります。) –

    答えて

    1

    あなたはSHFlushSFCache()を見つけるために、かなり(いつも雑用)シェルのドキュメントを通してかき回しようになってきました。

    特殊フォルダへのパスが変更されたときにSHFlushSFCacheが呼び出されます。これにより、キャッシュされた値ではなく、レジストリに格納された更新されたパスが使用されます。 「減価償却」として

    残念ながら、このルーチンがマークされているが、まだ(再)あなたの名前空間を登録した後、コールSHFlushSFCache()

    のWindows 10上で動作するようです。それはexplorer.exeを強制的にリロードする必要があります。

    関連する問題