1

我爲Windows 10寫了一個新的縮略圖處理程序。當我將其應用於自定義的「.mic」文件(將其重命名爲「.jpg」文件)時,處理程序運行良好。但是,出於某種原因,處理程序根本不會被稱爲「.jpg」文件。替換「.jpg」縮略圖處理程序

這些都是我「中的DllRegisterServer」期間添加到註冊表項:

// List of registry entries we want to create 
    const REGISTRY_ENTRY rgRegistryEntries[] = 
    { 
     { HKEY_LOCAL_MACHINE, L"Software\\Classes\\CLSID\\" SZ_CLSID_MYTHUMBHANDLER,       REG_SZ, NULL,    SZ_XDRVTHUMBHANDLER }, 
     { HKEY_LOCAL_MACHINE, L"Software\\Classes\\CLSID\\" SZ_CLSID_MYTHUMBHANDLER L"\\InProcServer32",  REG_SZ, NULL,    szModuleName }, 
     { HKEY_LOCAL_MACHINE, L"Software\\Classes\\CLSID\\" SZ_CLSID_MYTHUMBHANDLER L"\\InProcServer32",  REG_SZ, L"ThreadingModel", L"Apartment" }, 
     { HKEY_LOCAL_MACHINE, L"Software\\Classes\\.mic\\ShellEx\\{e357fccd-a995-4576-b01f-234630154e96}" , REG_SZ, NULL,    SZ_CLSID_MYTHUMBHANDLER }, 
     { HKEY_LOCAL_MACHINE, L"Software\\Classes\\.jpg\\ShellEx\\{e357fccd-a995-4576-b01f-234630154e96}" , REG_SZ, NULL,    SZ_CLSID_MYTHUMBHANDLER }, 
    }; 

    hr = S_OK; 
    for (int i = 0; i < ARRAYSIZE(rgRegistryEntries) && SUCCEEDED(hr); i++) 
    { 
     hr = CreateRegKeyAndSetValue(&rgRegistryEntries[i]); 
    } 

,當我試圖測試我的「ThumbnailProvider.exe」實用處理器(設有窗口SDK),它工作得很好。我使用「.jpg」文件運行實用程序,並且我的處理程序已成功調用。

爲什麼我的處理程序沒有被瀏覽器調用?

編輯:
在其他一些PC上,它似乎工作得很好。我的原始註冊碼運行良好,我的處理程序被稱爲「jpg」文件。兩臺電腦都具有Windows 10,實際上它們是使用相同基本映像的虛擬機。

編輯:
我注意到,我的處理程序正在被稱爲一些「.jpg」文件,而在其他人不需要。我在這裏可能是錯的,但我注意到的文件之間的主要區別是「解析單元」屬性。對於工作文件,此屬性沒有值,對於非工作文件,此屬性的值爲「2」。我的所有電腦上都有相同的行爲。 任何想法這個屬性如何影響被調用的縮略圖處理程序?如果它不是「解析單元」屬性,那麼導致它的差別是什麼?

+0

Software \\ Classes \\的默認值。jpg通常包含「jpegfile」(可以是其他任何內容),所以如果是這種情況,shell將查看Software \\ Classes \\ jpegfile。還要確保HKCU不會覆蓋任何東西。有關信息,HKCR是HKLM + HKCU Software \\ Classes的綜合視圖。 –

+0

我照你說的做了,我把它添加到「jpegfile」和「.jpeg」中。我在HKCR下看到他們都配置了我的處理程序。但是,我的處理程序仍然沒有被稱爲「.jpg」文件。 – michael

回答

0

我想我找到了爲什麼我的縮略圖處理程序沒有被某些「.jpg」文件調用的原因。看起來有些jpg圖像裏面嵌入了縮略圖。所以對於這些文件,根本不會調用縮略圖處理程序。
我用exiftool實用程序來讀取圖像屬性,在輸出I看到下面的行:
Photoshop Thumbnail : (Binary data 8015 bytes, use -b option to extract) Thumbnail Image : (Binary data 8015 bytes, use -b option to extract)

我用exiftool從文件中刪除縮略圖。一旦我做到了,我的處理程序就被成功地調用了這個圖像。

2

MSDN says您需要在註冊新擴展處理程序對象時調用SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)

如果您未調用SHChangeNotify,則可能無法識別更改 ,直到系統重新啓動。

在我的機器的微軟處理程序註冊爲HKLM\SOFTWARE\Classes\SystemFileAssociations\image下一個通用的處理程序,我相信,關鍵是應該有一個較低的優先級,但它可能是值得研究。正如Simon在評論中指出的,shell從HKCR讀取,這是一個組合視圖,HKEY_CURRENT_USER可以覆蓋HKEY_LOCAL_MACHINE,所以你也應該確保沒有爲你的特定用戶設置任何東西。

走進semi-documented領土,我們看到Explorer可能HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\CachedHKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Cached下緩存一些CLSID的信息,所以如果一切都失敗了,你可以嘗試刪除這些註冊表項(至少HKCU下一個應該是安全刪除)。

+0

我的處理程序基於windows SDK中的「Recipe」示例,所以我已經調用了'SHChangeNotify'。我嘗試刪除您提到的半文檔緩存,但仍然無效。重新啓動也沒有幫助。我也用@SimonMourier的建議嘗試過。 – michael

+0

我也想嘗試修改'HKLM \ SOFTWARE \ Classes \ SystemFileAssociations \ image',但這個鍵是隻讀的,不能修改。 – michael

+0

某些密鑰由系統/受信任的安裝程序擁有,您需要先獲得密鑰的所有權,然後才能更改ACL。 – Anders