2

背景

我有一個Shell Namespace Extension,其位於(using a virtual folder as its junction point)我的電腦下。可以爲我的命名空間擴展創建一個快捷方式。在這裏,我使用桌面上的快捷方式顯示了我的命名空間擴展。刷新在一個的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 Namespace Extension」。瀏覽到它應該會顯示你的%TEMP%目錄文件夾/文件。

  3. 通過將「我的名字空間擴展名」拖到桌面上,在桌面上創建一個到「我的名字空間擴展名」的快捷方式。

  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啓動時,它會嘗試解析桌面上的快捷方式。這樣做時,它將嘗試找到位於HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}的COM組件,但它將無法。打開資源管理器窗口到「我的電腦」,並觀察「我的命名空間擴展名」不存在。另請注意,快捷方式顯示爲未解決。通過重新將步驟1

  6. 註冊表更改刷新您的「我的電腦」窗口

  7. 重新安裝命名空間擴展。此時,您將處於有問題的狀態,您可以在「我的電腦」下看到命名空間擴展,但試圖瀏覽它不起作用。

  8. 如果此時重新啓動explorer.exe,問題將消失。這是因爲當explorer.exe試圖解析快捷方式時,它可以加載命名空間擴展COM組件,因爲它當前已在註冊表中註冊。

其他注意事項

  • 我真正的命名空間擴展是用C++編寫。

  • 我正在使用SHChangeNotify以使得名稱空間擴展在「我的電腦」下出現/消失,而不需要手動刷新,但這不會導致名稱空間擴展嘗試重新加載。

  • 也許令人驚訝的是,使用desktop.ini approach with .ShellClassInfo and CLSID註冊的命名空間擴展看起來並沒有遭受這個問題的困擾。不幸的是,我不能使用這種方法,因爲我需要在「我的電腦」下有我的命名空間擴展名。

+0

如果只有我們可以讓** C++ **標籤來寫這樣的問題! (好吧,不那麼複雜,但是具有這樣的細節。) –

回答

1

你必須通過程序文檔翻找了不少(總是一件苦差事)找到SHFlushSFCache()

當改變特殊文件夾的路徑時,會調用SHFlushSFCache。這確保使用存儲在註冊表中的更新路徑而不是緩存值。

不幸的是,這個程序被標記爲「貶值」,但它似乎仍然(重新)註冊你的命名空間後,在Windows 10

呼叫SHFlushSFCache()工作;應該強制explorer.exe重新加載它。

相關問題