共用方式為


Windows 機密文件16 位元圖示真的過氣了

Raymond Chen

我曾在 2008 年 2 月份的《Windows 機密文件》專欄中提到,Windows® 的確有淘汰部分功能。這些通常都是慢半拍又不起眼,每順利完成一件事,產品小組就要默默慶祝一次的功能。另外還有一項未出現在 Windows Vista® 的功能,就是 32 位元碼存取儲存在 16 位元模組 (通常是 16 位元 EXE 和 16 位元 DLL) 中之圖示的能力。

別激動,別忘了,16 位元碼還是可以存取儲存在 16 位元模組中的圖示;因為這些動作都是在 16 位元模擬層內進行。被淘汰的是從 32 位元碼存取那些圖示的能力,說得更明確一點,就是 32 位元圖示擷取函數 (例如 ExtractIcon 函數) 從 16 位元 DLL 載入那些圖示的能力。

從 16 位元模組擷取圖示的 32 位元碼,無法使用像 FindResource 這樣的核心函數來尋找檔案中的圖示,它必須實作自己的迷你載入器來剖析 16 位元模組標頭,尋找資源表,然後再剖析資源表,尋找所要的圖示資源。完成這些動作之後,才能將像素轉換成圖示。

  (按影像可放大)

您也知道,負責這個任務的程式碼已經年老力衰,在剖析可能損毀的位元時,很有可能因為犯錯或是受到惡意攻擊而發生錯誤。於是效能小組會要求變更開啟檔案的方法,以改善網路效能,因為不同的開啟和共用模式,會產生不同的網路快取效果。而可靠性小組也可能會要求重新寫入剖析碼,以避免使用記憶體對應檔案。最後維護這類程式碼的成本便開始超過它本身所提供的價值,您說,還有誰願意再寫 16 位元程式呢?

現在,只要 16 位元模擬層還在,16 位元程式仍然可以執行 (沒錯,64 位元 Windows Vista 沒有 16 位元模擬層,不過這不是 Windows XP 開倒車;因為 64 位元 Windows XP 也沒有 16 位元模擬層。雖然沒有因此改善什麼,倒也沒有任何惡化情況)。

Windows Vista 所失去的,只是從 32 位元程式執行 ExtractIcon,以及從 16 位元 DLL 取得圖示的能力而已。如果您的 [開始] 功能表有通往 16 位元程式的捷徑,該捷徑的圖示現在會變成一般程式圖示,因為 Windows Explorer 無法再從它的主要 EXE 擷取 16 位元程式的圖示了。這也不是什麼大不了的損失。不過如果您一直耿耿於懷的話,也可以編輯捷徑的內容,從 32 位元模組提出一個圖示給它。

如果一定要說少了這個功能會有什麼問題的話,那就是由特定圖示編輯工具產生的圖示了。因為某種原因,這個程式預設把圖示儲存為 16 位元 DLL 中的資源,也就是說,您再也無法從 32 位元碼存取那些圖示了。如果要暫時解決這個問題,很簡單,只要把那些圖示庫重新儲存為 32 位元 DLL 中的資源就行了。

我相信總有一天 (就算現在還沒有) 會有人撰寫一個小程式,從 16 位元 DLL 擷取所有的圖示,然後以那些圖示建立一個 32 位元資源專用的 DLL,讓那些還在使用 16 位元 DLL 舊圖示的人,能夠在 [開始] 功能表上的捷徑繼續沿用。不過話說回來,就算您真的寫出這個程式,恐怕也沒有人真正用得著。因為,向 Windows 使用者介面小組要求撰寫這類程式的人數根本就是:零。

Raymond Chen的網站「The Old New Thing」以及同名著作均探討 Windows 的歷史和 Win32 程式設計。他是一位嚴守規矩分際的人。

© 2008 Microsoft Corporation and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.