我有一個Shell Namespace Extension,其位於(using a virtual folder as its junction point)我的電腦下。可以爲我的命名空間擴展創建一個快捷方式。在這裏,我使用桌面上的快捷方式顯示了我的命名空間擴展。刷新在一個的explorer.exe命名空間擴展未能加載先前
如果我的空間擴展是不安裝,我當它被安裝爲預期將是懸而未決創建的快捷方式。
當我的應用程序啓動時,它會安裝我的空間擴展到註冊表中。當它退出時,它會從註冊表中刪除命名空間擴展名。這對於我的應用程序是必需的,因爲根據配置的不同,每次運行時加載的代表我的命名空間擴展名的dll都可能不同。
當我的應用程序是不運行和遇到的explorer.exe快捷方式到我的(目前未安裝)命名空間擴展,它試圖在註冊表中的COM組件看起來(快捷方式中包含的問題我的命名空間擴展的COM標識符) - 我通過Process Monitor觀察到了這一點。後來,當我的應用程序啓動時,我的命名空間擴展按預期添加到「我的電腦」下,但它不起作用 - 即試圖瀏覽它(雙擊)不能正常工作(不做任何事情) 。我通過進程監視器觀察顯示explorer.exe沒有重新嘗試加載我的命名空間擴展。似乎explorer.exe記住它無法爲我的命名空間擴展加載COM組件,因此它不會重試。這些症狀在這種狀態下,當有:
快捷方式顯示爲未解決
的空間擴展顯示了我的電腦下,但雙擊它不起作用。
- 的空間擴展並不在左側導航面板
顯示我發現解決這個問題一旦我在此狀態下重新啓動的唯一方法explorer.exe的。
問題
有沒有辦法讓explorer.exe的重試加載我的空間擴展,一旦它已經加載失敗一次(由於未解決的捷徑),而無需重新啓動的Explorer.exe ?
實例
下面是如何創建並從頭開始觀察問題的漫步。這涉及使用名爲Shell Instance Object(而不是我的真實名稱空間擴展名)的「內置」Microsoft名稱空間擴展名。爲了簡單起見,我使用了它,並且表明它與我的特定命名空間擴展無關。所有這個示例命名空間擴展名都會在「我的電腦」下創建一個圖標,它將瀏覽到您的%TEMP%目錄。
安裝名稱空間擴展名並將其註冊到「我的電腦」下。要做到這一點,輸入以下導入註冊表:
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"
在這一點上,當您打開一個瀏覽器窗口,並瀏覽「我的電腦」,你應該看到「My Namespace Extension」。瀏覽到它應該會顯示你的%TEMP%目錄文件夾/文件。
通過將「我的名字空間擴展名」拖到桌面上,在桌面上創建一個到「我的名字空間擴展名」的快捷方式。
完全從註冊表中刪除命名空間擴展註冊。在這一點上
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}]
重啓explore.exe(或做重新啓動):你可以通過手動刪除上面的鍵或通過運行以下.reg文件。當explorer.exe啓動時,它會嘗試解析桌面上的快捷方式。這樣做時,它將嘗試找到位於
HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}
的COM組件,但它將無法。打開資源管理器窗口到「我的電腦」,並觀察「我的命名空間擴展名」不存在。另請注意,快捷方式顯示爲未解決。通過重新將步驟1註冊表更改刷新您的「我的電腦」窗口
重新安裝命名空間擴展。此時,您將處於有問題的狀態,您可以在「我的電腦」下看到命名空間擴展,但試圖瀏覽它不起作用。
如果此時重新啓動explorer.exe,問題將消失。這是因爲當explorer.exe試圖解析快捷方式時,它可以加載命名空間擴展COM組件,因爲它當前已在註冊表中註冊。
其他注意事項
我真正的命名空間擴展是用C++編寫。
我正在使用SHChangeNotify以使得名稱空間擴展在「我的電腦」下出現/消失,而不需要手動刷新,但這不會導致名稱空間擴展嘗試重新加載。
也許令人驚訝的是,使用desktop.ini approach with .ShellClassInfo and CLSID註冊的命名空間擴展看起來並沒有遭受這個問題的困擾。不幸的是,我不能使用這種方法,因爲我需要在「我的電腦」下有我的命名空間擴展名。
如果只有我們可以讓** C++ **標籤來寫這樣的問題! (好吧,不那麼複雜,但是具有這樣的細節。) –