Nous sommes le Jeu 18 Sep, 2025 20:34
Supprimer les cookies

Aide NSIS Enregistrer les modifications

Image Image Forum dédié à notre projet de clé USB nomade libre sous Windows

Sam 28 Août, 2010 11:04

Bonjour à tous....

J'aimerai savoir comment faire pour sauvegarder les modifications faite par le programme durant son exécution.

J'ai essayer de portabilisé aMSN ce programme est assez portable puisqu'il crée uniquement un dossier dans $PROFILE\amsn (C:\Documents and Settings\USERNAME\amsn) (les clés de registre crée sont inutile)

Mon problème est que mon launcher crée bien les fichier dans $PROFILE\amsn le programme fonctionne par contre il ne me sauvegarde pas les fichiers crées durant l'utilisation du logiciel!! Et une fois fini il ne supprime pas le dossier crée...

J'aimerais donc savoir comment faire pour que les modifications soit copier dans le dossier data et de supprimer le dossier une fois le programme fermé.

Merci pour votre aide


Pour ce qui est des fichiers
App
>aMSN
>contient les fichiers du programme
Data
>amsn
>contient les fichiers data qui vont dans C:\Documents and Settings\USERNAME\amsn
Source
> Contient mon icone ainsi que mon script nsi
Voici mon code pour le launcher

Code: Tout sélectionner
/* CONSTANTS */
; --- Define Version and Name
   !define VER       "0.0.0.1"; version of launcher
   !define APPNAME    "aMSN"; complete name of program
   !define APP       "aMSN"; short name of program without space and accent  this one is used for the final executable an in the directory structure
   !define APPEXE       "aMSN.exe"; main exe name
   !define APPDIR       "App\aMSN"; main exe relative path
;!define APPSWITCH    ``; some default Parameters

; ---Define Local Dirs and Portable Dirs ---
   !define LOCALDIR1 "$PROFILE\amsn"
   !define PORTABLEDIR1 "$EXEDIR\Data\amsn"

/* Set basic information */
   Name "${APPNAME} Portable"
   OutFile "..\${APP}Portable.exe"
   Icon "${APP}.ico"

/* Set version information */
   Caption "${APPNAME} Portable"
   VIProductVersion "${VER}"
   VIAddVersionKey ProductName "${APPNAME} Portable"
   VIAddVersionKey Comments "${APPNAME} peu être executer sans installation préalable."
   VIAddVersionKey CompanyName ""
   VIAddVersionKey LegalCopyright ""
   VIAddVersionKey FileDescription "${APPNAME} Portable"
   VIAddVersionKey FileVersion "${VER}"
   VIAddVersionKey ProductVersion "${VER}"
   VIAddVersionKey InternalName "${APPNAME} Portable"
   VIAddVersionKey LegalTrademarks ""
   VIAddVersionKey OriginalFilename "${APP}Portable.exe"

/* Best Compression */
   SetCompressor /SOLID lzma
   SetCompressorDictSize 32

/* Runtime Switches */
   WindowIcon Off
   SilentInstall Silent
   AutoCloseWindow True
   RequestExecutionLevel user
   
/* Running */
   Section "Main"
      Call BackupLocalDirs
      Call RestorePortableDirs

         Call Launch

      Call BackupPortableDirs
      Call RestoreLocalDirs
   SectionEnd

/* Run Application */
   Function Launch
   ;SetOutPath "$EXEDIR\${APPDIR}"
   ;${GetParameters} $0
      ExecWait "$EXEDIR\${APPDIR}\${APPEXE}"
   ;WriteINIStr "$EXEDIR\Data\${APP}Portable.ini" "${APP}Portable" "GoodExit" "true"
   FunctionEnd

/* Actions on Folders */
   Function BackupLocalDirs
      RMDir "/r" "${LOCALDIR1}-BackupBy${APP}Portable"
      Rename "${LOCALDIR1}" "${LOCALDIR1}-BackupBy${APP}Portable"
   FunctionEnd

   Function RestorePortableDirs
      IfFileExists "${PORTABLEDIR1}\*.*" +4
      IfFileExists "$EXEDIR\Data\amsn\*.*" 0 +5
      CreateDirectory "${PORTABLEDIR1}"
      CopyFiles /SILENT "$EXEDIR\Data\amsn\*.*" "${PORTABLEDIR1}"
      CreateDirectory "${LOCALDIR1}"
      CopyFiles /SILENT "${PORTABLEDIR1}\*.*" "${LOCALDIR1}"
   FunctionEnd

   Function BackupPortableDirs
      RMDir "/r" "${PORTABLEDIR1}"
      CreateDirectory "${PORTABLEDIR1}"
      CopyFiles /SILENT "${LOCALDIR1}\*.*" "${PORTABLEDIR1}"
   FunctionEnd

   Function RestoreLocalDirs
      RMDir "/r" "${LOCALDIR1}"
      Rename "${LOCALDIR1}-BackupBy${APP}Portable" "${LOCALDIR1}"
   ;RMDir "${LOCALDIR1}"
   FunctionEnd
instabledesign

Messages : 3

Sam 28 Août, 2010 13:17

Bonjour,

Déjà, il existe une version d'aMSN Portable : http://framakey.org/Portables/AMSNPortable

Ensuite, le problème majeur avec ton script est dû à l'ExecWait qui se fait sur amsn.exe.
Si tu regardes les processus, tu verras que amsn.exe se lance puis se ferme tout de suite, il passe le relais à wish.exe.

Moralité : lorsqu'aMsn parait lancé, ton lanceur a lancé tes 5 fonctions et a terminé son boulot.

Je n'ai pas été plus loin, tu peux peut-être jeter un oeil au lanceur d'aMSNPortable.
Vécu : "J'ai une version crackée d'OpenOffice, c'est pour ça qu'elle est en anglais"
fat115

Avatar de l’utilisateur
Messages : 930
Géo : Ardèche ... du nord

Sam 28 Août, 2010 13:39

Ok!!!! COOOL
Je vien d'essayer ça
Code: Tout sélectionner
MessageBox MB_OK "Actions avant"
ExecWait "calc.exe"
MessageBox MB_OK "Actions après"

C'est exactement ce que je voulais comme comportement.. que le code attende la fermeture du soft pour continuer les instructions..
Par contre comment faire pour qu'il me détecte l'exécution de amsn.exe ET de wish.exe?? avant de continuer les instructions??
Ou une autre solution peu être...

Je sais que amsn portable est proposé mais c'est une démarche d'apprentissage... :)

Dans la version framasoft il font comme suit: (j'avoue ne pas avoir tout saisie)
Code: Tout sélectionner
LaunchNow:
      SetOutPath `$PROGRAMDIRECTORY`
      System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("AMSNPORTABLEDATA", "$SETTINGSDIRECTORY").r0'
      Exec $EXECSTRING
instabledesign

Messages : 3

Sam 28 Août, 2010 15:14

1/ ExecWait ne peut attendre que la fin d'exécution du processus lancé par l'instruction.
Pour surveiller un autre processus, il faudra faire une boucle de vérification genre :
Code: Tout sélectionner
      ${Do}
         Sleep 1000
         FindProcDLL::FindProc "$AppExecutable"
      ${LoopUntil} $R0 = 0
Boucle qui nécessite le plugin FindProcDLL ( http://nsis.sourceforge.net/FindProcDLL_plug-in ) et la bibliothèque LogicLib ( http://nsis.sourceforge.net/LogicLib )

2/ l'instruction System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("AMSNPORTABLEDATA", "$SETTINGSDIRECTORY").r0' permet de définir une variable d'environnement nommée AMSNPORTABLEDATA et ayant pour valeur le contenu de la variable $SETTINGSDIRECTORY.
Ça sent les sources patchées par PortableApps à plein nez. Du coup, il y a des chances que la version Framasoft ne fonctionne pas correctement. À vérifier donc.
Vécu : "J'ai une version crackée d'OpenOffice, c'est pour ça qu'elle est en anglais"
fat115

Avatar de l’utilisateur
Messages : 930
Géo : Ardèche ... du nord

Sam 28 Août, 2010 16:42

Un grand merci a toi pour ces infos je testerais la boucle dès demain j'espère avoir un version qui fonctionne...
Je posterais le code final si ca marche...
instabledesign

Messages : 3

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit