我一直在嘗試從桌面應用程序獲取系統上安裝的所有UWP應用程序的顯示名稱(用戶友好的應用程序名稱)。我試圖從與這些應用程序相對應的註冊表項獲取的資源字符串上使用SHLoadIndirectString()
。讓我們以Windows計算器爲例。SHLoadIndirectString()如何在內部工作?
SHLoadIndirectString()使用
它的資源串可以從HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\Repository\Packages\Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe\DisplayName
註冊表項來獲得。 我的系統上的資源字符串是@{Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.WindowsCalculator/Resources/AppStoreName}
要獲得顯示名稱,我會做SHLoadIndirectString(@{Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.WindowsCalculator/Resources/AppStoreName})
。
實驗觀察
- (實驗1)我用
SHLoadIndirectString()
爲兩個不同的用戶(U1,U2和)。 U1的語言設置爲英語,U2的語言設置爲法語(FR-fr)。當從U1運行SHLoadIndirectString()時,它返回Windows Calculator
,對於U2我得到Calculatrice Windows
。因此,爲同一資源字符串返回的值取決於當前用戶的語言設置。 - (實驗2)我在U2安裝了UWP應用程序,並沒有SHLoadIndirectString()在DiplayName資源字符串。我在U1中出錯,但在U2中,它正確地給了我所需的字符串。
- (實驗3)當我添加到資源文件
(resources.pri)
的路徑,資源字符串,我沒有在U1的錯誤。之前的資源字符串是@{DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar_5.1.12.0_x64__3nf5xjt6s13jt?ms-resource://DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar/Resources/AppName}
,稍後我將其修改爲@{C:\\Program Files\\WindowsApps\\DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar_5.1.12.0_x64__3nf5xjt6s13jt\\resources.pri?ms-resource://DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar/Resources/AppName}
,然後傳遞給SHLoadIndirectString()
。
尋找解決
- SHLoadIndirectString()'s documentation表示,其返回值取決於
Shell environment or ResourceContext
,沒有給每個細節很多。 試圖重新創建Windows NT API來運行Windows應用程序的兩個項目是ReactOS和wine。我查看了他們的源代碼,找到了
SHLoadIndirectString()
的實現,但代碼似乎要做的就是在開始時刪除@
符號後,在資源字符串上執行LoadLibrary()
。這沒有任何意義,爲什麼系統中會有這樣的DLL,因爲每個應用程序的資源字符串都不同?
這是非常龐大而複雜的API。在更具體的問題? – RbMm