J'ai essayé d'obtenir des noms d'affichage (nom convivial d'une application) de toutes les applications UWP installées sur un système à partir d'une application de bureau. J'essaye d'employer SHLoadIndirectString()
sur la chaîne de ressource obtenue de l'entrée de registre correspondant à ces apps. Prenons le cas de la calculatrice Windows.Comment SHLoadIndirectString() fonctionne-t-il en interne?
SHLoadIndirectString() Utilisation
Il est chaîne de ressource peut être obtenue à partir HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\Repository\Packages\Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe\DisplayName
entrée de Registre. La chaîne de ressources sur mon système pour cela est @{Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.WindowsCalculator/Resources/AppStoreName}
Pour obtenir le nom d'affichage, je voudrais faire SHLoadIndirectString(@{Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.WindowsCalculator/Resources/AppStoreName})
.
observation expérimentale
- (Experiment 1) I utilisé
SHLoadIndirectString()
pour deux utilisateurs différents (U1, U2 et). La langue de U1 était l'anglais, la langue de U2 était le français (FR-fr). Lorsque SHLoadIndirectString() a été exécuté à partir de U1, il a retournéWindows Calculator
, et pour U2 j'ai obtenuCalculatrice Windows
. Ainsi, la valeur renvoyée pour la même chaîne de ressources dépend du paramètre de langue de l'utilisateur actuel. - (Expérience 2) J'ai installé une application UWP U2, et a fait SHLoadIndirectString() à la chaîne de ressources dans DiplayName. J'ai eu une erreur dans U1, mais dans U2, cela m'a donné la chaîne requise correctement.
- (Expérience 3) Quand j'ajouté chemin vers le fichier de ressources
(resources.pri)
, à la chaîne des ressources, je me suis pas d'erreur dans U1. La chaîne de ressources antérieure était@{DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar_5.1.12.0_x64__3nf5xjt6s13jt?ms-resource://DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar/Resources/AppName}
, que j'ai ensuite modifiée en@{C:\\Program Files\\WindowsApps\\DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar_5.1.12.0_x64__3nf5xjt6s13jt\\resources.pri?ms-resource://DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar/Resources/AppName}
avant de passer àSHLoadIndirectString()
.
Trouver des solutions
- SHLoadIndirectString()'s documentation dit que sa valeur retournée dépend de
Shell environment or ResourceContext
, sans donner beaucoup de détails pour chacun. Deux projets qui tentent de créer Windows NT API pour exécuter des applications Windows sont ReactOS et wine. J'ai regardé à travers leur code source pour trouver l'implémentation de
SHLoadIndirectString()
, mais tout ce que les codes semblent faire est de faire unLoadLibrary()
sur la chaîne de ressource, après avoir enlevé le symbole@
au début. Cela n'a aucun sens, pourquoi y aurait-il un tel DLL dans un système, car la chaîne de ressources pour chaque application est différente?
c'est très énorme et complexe api. dans quelle question plus concrète? – RbMm