2017-10-13 8 views
0

J'essaie de vérifier si une application est installée avant d'installer la mienne. Voici le code que je utiliseNSIS Rechercher l'application installée

; Check to see if already installed 
    ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{D9C50188-12D5-4D3E-8F00-682346C2AA5F}" "UninstallString" 
    IfFileExists $R0 +1 NotInstalled 
    MessageBox MB_OK|MB_TOPMOST "App Installed" 

Goto InstallCont2 

Il fonctionne si le nom est un nom réel, mais si le nom est comme ceci:

{D9C50188-12D5-4D3E-8F00-682346C2AA5F}

alors il ne le détecte pas. J'ai essayé de mettre différent "ou" sur la ligne, mais je ne peux pas trouver le code correct pour cela

Répondre

0

Un GUID dans le chemin n'a pas d'importance Si vous ne pouvez pas lire la valeur, il peut s'agir d'un problème 64 bits et vous devrez peut-être SetRegView. Process Monitor pourrait être en mesure d'aider, mais avant de creuser des outils de débogage, vous devez simplement faire MessageBox mb_ok $R0 après ReadRegStr pour voir si elle lire quoi que ce soit.

vous ne pouvez pas simplement appeler IfFileExists sur les chaînes lues à partir UninstallString car la chaîne peut contenir les guillemets et/ou les arguments de la ligne de commande dont vous avez besoin pour dépouiller d'abord

Yo vous pouvez utiliser quelque chose comme ça pour obtenir juste le chemin:

!macro GetAppPathFromCommandLine output input 
Push '${input}' 
Call GetAppPathFromCommandLine 
Pop ${output} 
!macroend 
Function GetAppPathFromCommandLine 
Exch $0 ; input 
Push $1 ; find 
Push $2 ; start offset 
Push $3 ; temp 
Push $4 ; pos 
StrCpy $1 ' ' 
StrCpy $2 "" 
StrCpy $3 $0 1 
StrCpy $4 -1 
StrCmp $3 '"' 0 +4 
StrCpy $1 $3 
StrCpy $2 1 
StrCpy $4 "" 
loop: 
IntOp $4 $4 + 1 
StrCpy $3 $0 1 $4 
StrCmp $3 "" done 
StrCmp $3 $1 done loop 
done: 
IntOp $4 $4 - $2 
StrCpy $0 $0 $4 $2 
Pop $4 
Pop $3 
Pop $2 
Pop $1 
Exch $0 
FunctionEnd 

Section 
!insertmacro GetAppPathFromCommandLine $0 'c:\foo\bar.exe' 
DetailPrint |$0| 
!insertmacro GetAppPathFromCommandLine $0 '"c:\foo bar\baz.exe"' 
DetailPrint |$0| 
!insertmacro GetAppPathFromCommandLine $0 'c:\foo\bar.exe param1 "pa ra m2" param3' 
DetailPrint |$0| 
!insertmacro GetAppPathFromCommandLine $0 '"c:\foo bar\baz.exe" param1 "pa ra m2" param3' 
DetailPrint |$0| 
SectionEnd