2017-02-08 1 views
0

Pour comparer les versions, je dois savoir si mon application a déjà été installée. J'utilise le registre pour stocker toute l'information nécessaire et il serait très utile si je pouvais en quelque sorte lire les chaînes du registre. Le problème principal ici est que je ne connais pas mon propre GUID qui a été randomisé lors d'une installation précédente.Comment puis-je trouver une application si je ne connais pas son GUID?

Pour générer mon chemin de registre, j'ai écrit le script suivant:

Function .onInit 
    ${If} ${RunningX64} 
     StrCpy $R0 "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" 
    ${Else} 
     StrCpy $R0 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 
    ${EndIf} 
FunctionEnd 

tronçon principal:

Section "Main" sec 
System::Call 'ole32::CoCreateGuid(g .s)' 
Pop $0 
WriteRegStr HKLM "$R0\$0" 'DisplayVersion' '${AppVersion}' 
SectionEnd 

Donc, au fond, je dois trouver un moyen de lire la chaîne DisplayVersion. Je souhaite qu'il y avait une variation de FindFirst mais pour le registre.

Répondre

0

Utilisez EnumRegKey pour énumérer les clés de Registre:

!include LogicLib.nsh 

Section 

StrCpy $0 0 
loop: 
    EnumRegKey $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0 
    StrCmp $1 "" done 
    ReadRegStr $2 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "DisplayName" 
    ${If} $2 == "My Application Name" 
     ReadRegStr $2 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "DisplayVersion" 
     DetailPrint "TODO: Compare $2 to version here..." 
    ${EndIf} 
    IntOp $0 $0 + 1 
    Goto loop 
done: 

SectionEnd 
+0

Wow, merci! – CeeZee