Hello, LSI avait poster un code qui pourait etre une solution a ton problème, il pemetrait d'empecher de relancer l'install, que ce soit l'originale ou non apres un premier lancement. En general on lance toujours le programme une premiere foi voir si ça marche avant de la copier / distribuer.
Le poste de LSI :
http://www.purebasic.fr/french/viewtopic.php?t=435
Je me suis basé sur son code, mais je ne recherche pas la data section dans l'install, enfait je l'ai chercher une foi l'install compilée, j'ai mis directement la position dans l'install puis recompiler. J'utilise une byte pour dir si oui ou non l'install à dejas ete faite.
Bon c'est peut etre un peut voyant, mais rien de t'empeche d'inclure une image et d'utiliser la composante verte dur 785eme pixel de cette image à la place
c'est commenté a l'arrache, j'vais etre a la bourre au boulot!
Code : Tout sélectionner
; Creation de la fenetre... blablabla
OpenWindow(0, 0, 0, 250, 60, "Install Test Special KCC", 13107201)
TextGadget(0, 12, 10, 70, 16, "Install path :")
StringGadget(1, 75, 8, 165, 20, "MEM:\KCC's Knowledge\", #PB_String_ReadOnly)
ButtonGadget(2, 95, 30, 60, 20, "Next")
ProgressBarGadget(3, 10, 10, 230, 15, 0, 100, #PB_ProgressBar_Smooth)
HideGadget(3, 1)
TextGadget(4, 12, 10, 220, 20, "The application was installed correctly!")
HideGadget(4, 1)
Quit.b = #False ; On quit ou pas?
Install.b = #False ; c'est juste pour la demo, on s'en fou
ClearInstall.b = #False ; indique au programe que c'est la fin des haricots... euh... de l'install
Select ProgramParameter()
Case "InstallFinished" ; Ce parametre signifi que l'install est terminée, donc notre byte de verification passe a 1 (pour rappel, c'est temp.exe qui est lancé là)
OpenFile(0, "Install_Test.exe") ; on ouvre le fichier d'install
FileSeek(0, 16177) ; on se position là où il faut et non où il faut pas, logique...
WriteByte(0, 1) ; et voila!
CloseFile(0)
RunProgram("Install_Test.exe", "ClearInstall", "") ; une fois fait, on relance l'install avec en param ClearInstall
End ; et on ferme le temp.exe
Case "ClearInstall" ; Ici l'install est terminée
ClearInstall = #True
DeleteFile("temp.exe") ; on supprime le temp.exe qui nous a bien aidé
Install = #True ; et on fait le necessaire pour afficher le message qui va bien, enfin, presque!
HideGadget(0, 1) ; Install_Test.exe et Temp.exe vecurent heureux mais n'auront pas d'enfant
HideGadget(1, 1)
HideGadget(4, 0)
SetGadgetText(2, "Quit")
Default ; s'il n'y a pas de params, on verifi notre byte au cas ou il y aurait une couille dans le paté!
ReadFile(0, "Install_Test.exe") ; blabla
FileSeek(0, 16177) ; expliqué plus haut
Verif.b = ReadByte(0)
CloseFile(0)
If Verif = 1 ; Bingo! L'install à deja été faite, et notre byte est à 1, donc il y a une couille (pour un homme il en faut deux, mais pour un programme aucune :p)
MessageRequester("Error, Error, Error, Err...", "Program already installed, please contact the vendor for more informations.", 0) ; aller petit vilain
End ; essay encor!
EndIf
EndSelect
Repeat ; Boucle principale... hmm... que dir de plus?
If Install = #True And GetGadgetState(3) < 100 And GetTickCount_() - Timer >= 10 ; l'anim du progressbar, on s'en fou mais ça fait beau
Timer = GetTickCount_()
SetGadgetState(3, GetGadgetState(3) + 1)
If GetGadgetState(3) = 100
DisableGadget(2, 0)
EndIf
EndIf
wEvent = WindowEvent(); bon tout ça je passe, c'est bien toi qui vois comment tu veux fair ton install
Select wEvent
Case #PB_Event_Gadget
Select EventGadget() ; et blablabla
Case 2
If Install = #False
Install = #True
DisableGadget(2, 1) ; blablabla
HideGadget(0, 1)
HideGadget(1, 1)
HideGadget(3, 0) ;blabla
SetGadgetText(2, "Next")
Timer = GetTickCount_()
Else
Quit = #True
EndIf
EndSelect
Case #WM_CLOSE
Quit = #True
Default
Delay(20) ; bliblobla
EndSelect
Until Quit = #True ; blabla... ha on quit ok... mais avant de End :
If ClearInstall = #False ; si on avait lancé Install_Test.exe avec ClearInstall, ben on ferme simplement, sinon!
CopyFile("Install_Test.exe", "temp.exe") ; On copi le fichier d'install en temp.exe (c'est le comble, on veut empecher la copie en copiant :D)
RunProgram("temp.exe", "InstallFinished", "") ; et on le lance avec le param qui va bien pour modifier notre byte
EndIf
End ; aurevoir :(
DataSection ; voir le code de LSI, il est bien commenté :)
Data.s "DataStart"
Data.b 0
Data.s "DataEnd"
EndDataSection