我一直在尝试从桌面应用程序获取系统上安装的所有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