題 XP-7雙啟動奇怪的快捷方式圖標問題


我雙啟動Windows XP和Windows 7,並遇到了一個特殊的問題,快捷方式的圖標。

每個操作系統都使用不同的桌面,因此每個操作系統都有一個快捷方式,可以從任一版本的Windows輕鬆訪問;也就是說,在XP中,桌麵包含一個名為的快捷方式 7Desk 在7中,桌麵包含一個名為的快捷方式 XPDesk。進一步, 7Desk.lnk 設置為使用桌面圖標資源 shell32.dll 來自Windows 7,和 XPDesk.lnk 設置為使用桌面圖標資源 shell32.dll 來自Windows XP。這樣,每個快捷方式都會顯示桌面的其他操作系統圖標。

問題是即使在 改變圖標 對話框我可以看到正確的圖標(對於其他操作系統),當我單擊“確定”時,圖標會顯示相應的圖標 目前已啟動操作系統 而不是另一個。我已經確認這對於其他圖標資源以及回收站圖標也是如此。

這是令人困惑的,因為就Windows而言 改變圖標 對話)有關, shell32.dll 從另一個驅動器只是一個包含圖標的文件。它沒有理由專門處理DLL,更神秘的是它如何知道它的哪個 擁有 用來代替它的圖標。也就是說,XP如何知道使用XP桌面圖標代替7桌面圖標,或者7如何知道使用7回收站圖標代替XP回收站圖標?為了讓事情變得更加混亂,我在十六進制編輯器中檢查了LNK文件,並且可以清楚地看到圖標資源確實指向另一個驅動器上的文件,  簡單地說 \windows\system32\shell32.dll

(當然,圖標索引是相同的,所以也許它只是使用自己的副本 shell32.dll 而不是在不同的驅動器上指定的那個,但是, 為什麼這樣做呢?它是某種“AI” 更改對話框 功能,嘗試做我們想要的而不是我們說的話?)

如果問題不清楚,我可以錄製一個屏幕演員。


3
2017-09-14 22:19


起源




答案:


Windows可能使用LoadLibrary來加載帶有圖標的DLL。當LoadLibrary看到加載了DLL時,它將使用已加載的DLL;檢查基於DLL名稱,而不是位置。

如果是這樣,解決方法是創建具有不同名稱的shell32.dll庫的副本(例如,shell32-xp.dll和shell32-7.dll),然後更改圖標以引用這些文件。


3
2017-09-14 23:04



好吧,我只是這樣做似乎有效(至少在7;我下次重啟時會檢查XP,但我懷疑它會是一樣的)。我並不熱衷於擁有10MB +文件的四個副本,所以也許我只是提取圖標並鏈接到那些。處理圖標似乎是一種非常糟糕的方式。 ICO,ICL和EXE文件怎麼樣?我想它不會/不能為那些做同樣的愚蠢,所以為什麼它會專門處理DLL?我可以理解為功能而不是資源,至少在這種情況下不這樣做。無論如何,謝謝你的想法;這似乎是正確的。 - Synetech
提取圖標聽起來是個好主意。對此行為的可能解釋:從已加載的DLL中拉取圖標要快得多,因為這是一種常見情況,Microsoft已對其進行了優化。 EXE可能使用相同的方法,ICO等可能不會。 - jdigital
是的,使用來自加載的DLL的資源對於某些方面(特別是UI元素)是有意義的,但不是可以從任何地方繪製的快捷方式。我想這是典型的狹隘觀點的另一個例子, 只考慮我自己的軟件 許多程序員陷入困境的心態。無論哪種方式,我提取它們,它現在工作得很好(即使它確實感覺有點hack-y而不是“聰明”和動態)。 :-) - Synetech


要繞過複製部分,您可以將它們硬鏈接,每個都在自己的驅動器上。這至少是我所做的。並且沒有更多的文件有多個副本。

fsutil hardlink create \WINDOWS\system32\shell32_xp.dll \WINDOWS\system32\shell32.dll

這個是在XP方面。在Windows 7端,用_7 :)替換_xp部分

編輯:我已經看到Windows 7端的那個不起作用。除非您破壞權限(有可能破壞系統中的所有內容),否則您應該只在XP端執行此操作。

如果您仍想執行此操作,則必須獲取文件的所有權並更改權限,但請再次收到警告!


0
2018-02-03 01:30