【发布时间】:2018-02-10 19:26:00
【问题描述】:
我一直在尝试从桌面应用程序获取系统上安装的所有 UWP 应用程序的显示名称(应用程序的用户友好名称)。我正在尝试在从与这些应用程序对应的注册表项获得的资源字符串上使用SHLoadIndirectString()。让我们以 windows 计算器为例。
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 应用,并对 DiplayName 中的资源字符串执行 SHLoadIndirectString()。我在 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。还有什么更具体的问题?