bonjour,
voici une dll qui permet de mettre à jour vos projets (l'executable, vos datas (textures, son,...), tout ce qui se rapporte a votre projet)
je vous poste le lien pour télécharger le tout. car il y a un exe de test inclu.
(je n'ai pas mis la source de la dll car elle peut etre mise à jour souvent, mais juste la source exemple pour savoir comment construire vos projets)
cette dll repose sur une gestion de fichier xml qui doit accompagner chaque fichier à mettre à jour
je posterai surement la source de la dll quand j'aurais une version qui ne nécessitera plus de mise à jour.
à part l'algo, la plupart du code se base sur les autres sources que j'ai posté sur cppfrance (CFilex, CDownload).
-la gestion xml est la librairie tinyxml
-la gestion pour dezipper est une source de Gilles Vollant légérement modifiée
voici un exemple
Source / Exemple :
include "stdafx.h"
#include <windows.h>
#include "darkupdate/darkupdate.h"
UpdateGlobalListFunc UpdateGlobalList=NULL;
TestFileFunc TestFile=NULL;
InitializeFunc Initialize=NULL;
DeleteGlobalListFunc DeleteGlobalList=NULL;
LaunchInstallFunc LaunchInstall=NULL;
UpdateDarkProjectFunc UpdateDarkProject=NULL;
CreateFileVersionFunc CreateFileVersion=NULL;
LaunchMeFromDosFunc LaunchMeFromDos=NULL;
//LaunchMeFromWin32Func LaunchMeFromWin32=NULL;
HINSTANCE Module=NULL;
DLL_API void EventMessage(char *message)
{
printf("%s\n",message);
}
int main(int argc, char* argv[])
{
char MYPATH[4096],DLLMYPATH[4096],EXENAME[4096],FULLPATH[4096];
GetModuleFileName(GetModuleHandle(NULL), MYPATH, 4096);
strcpy(FULLPATH,MYPATH);
char *ft=strrchr(MYPATH,'\\');
if (ft) {
ft++;
strcpy(EXENAME,ft);
} else {
strcpy(EXENAME,MYPATH);
strcpy(MYPATH,".\\");
}
while (1) {
strcpy(DLLMYPATH,MYPATH);
strcat(DLLMYPATH,"DarkUpdate.dll");
Module = LoadLibrary(DLLMYPATH);
if (!Module) return NULL;
UpdateGlobalList=(UpdateGlobalListFunc)GetProcAddress(Module, "UpdateGlobalList");
TestFile=(TestFileFunc)GetProcAddress(Module, "TestFile");
Initialize=(InitializeFunc)GetProcAddress(Module, "Initialize");
DeleteGlobalList=(DeleteGlobalListFunc)GetProcAddress(Module, "DeleteGlobalList");
LaunchInstall=(LaunchInstallFunc)GetProcAddress(Module, "LaunchInstall");
UpdateDarkProject=(UpdateDarkProjectFunc)GetProcAddress(Module, "UpdateDarkProject");
CreateFileVersion=(CreateFileVersionFunc)GetProcAddress(Module, "CreateFileVersion");
LaunchMeFromDos=(LaunchMeFromDosFunc)GetProcAddress(Module, "LaunchMeFromDos");
//LaunchMeFromWin32=(LaunchMeFromWin32Func)GetProcAddress(Module, "LaunchMeFromWin32");
Initialize(EventMessage); // pour afficher les messages
if (LaunchMeFromDos(FULLPATH,argc,argv)) {
FreeLibrary(Module); //si on rentre la, soit ya eu une erreur -1, soit on a executé le tmp
return 0;
}
// si on arrive ici, on est dans le fichier temp
if (UpdateDarkProject(DLLMYPATH) == 1) { // on met à jour la darkupdate.dll
char NEWDLL[4096];
FreeLibrary(Module);
strcpy(NEWDLL,MYPATH);
strcat(NEWDLL,"DarkUpdate.xxx");
DeleteFile(DLLMYPATH);
MoveFile(NEWDLL,DLLMYPATH);
} else break;
}
CreateFileVersion("1.1",MYPATH,"demo"); // on creer le fichier xml
char globallist[4096];
char xmlpath[4096];
UpdateGlobalList("
http://dark.freezee.org/darkupdate/demolist.php",globallist,4096); // recuperation de la liste
if (TestFile(FULLPATH,"demo",globallist,"demoversion",xmlpath,4096)) { //nouvelle version ?
char *exe=strrchr(FULLPATH,'.'); // necessaire de transformer le .tmp en .exe sinon la mise a jour de l'exe ne passera pas
if (exe) strcpy(exe,".exe"); //malgres cette petite contraite, cela permet de mettre a jour l'exe meme si on change le nom de celui-ci
int r=LaunchInstall(FULLPATH,xmlpath); // mise à jour effectuée si r==1
}
for (int j=0;j<argc;j++) printf("%s\n",argv[j]);
/*
la suite de votre programme ici
exemple:
if (TestFile("f:\\sound.wav","sound",globallist,"data",xmlpath,4096)) {
int r=LaunchInstall("f:\\sound.wav",xmlpath);
}
playsound("f:\\sound.wav");
DeleteGlobalList(globallist);
FreeLibrary(Module);
return 0;
}
Conclusion :
téléchargeable ici :
http://dark.freezee.org/darkupdate/demo1.0.zip
consulter le fichier texte pour la documentation
#include "stdafx.h"
#define ALLOC_GLOBAL
#include "../../imajin.h"
#include<direct.h>
#include <stdio.h>
DLL_API void EventMessage(const char *message)
{
if (!strnicmp(message,"Info : ",7)) {
printf(message);
} else if (!strnicmp(message,"Error : ",8)) {
printf(message);
} else if (!strnicmp(message,"Warning : ",10)) {
printf(message);
} else if (!strnicmp(message,"NewVersion : ",12)) {
printf(message);
} else if (!strnicmp(message,"NewInfo : ",10)) {
printf(message);
} else {
printf(message);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char exeroot[4096];
char exe[4096];
bool update = false; // the tool can use the iMAJin.dll
HMODULE Module =NULL;
GetModuleFileName(GetModuleHandle(NULL), exeroot, 4096);
strcpy(exe,exeroot);
char *a=strrchr(exeroot,'\\');
*(++a) = '\0';
// define the current directory
chdir(exeroot);
printf("-------- Democonsole version 1.0 for iMAJin dll --------\n");
while (1) {
DeleteFile(".\\iMAJin.tmp");
CopyFile(".\\iMAJin.dll",".\\iMAJin.tmp",false);
Module = LoadLibrary(".\\iMAJin.tmp");
if (!Module) {
printf("please, copy the iMAJin.dll to %s\n",exeroot);
update = false;
break;
}
InitializeUpdateDll(Module); //launch the function in iMAJin.h
Initialize(EventMessage); // to display the messages
// return 1 if imAJin.dll is updated
if (!UpdateiMAJin(Module)) {
update = true;
break;
}
}
if (update) {
// comment this lines to debug the project
// ---------------------------------------
// return 0 if the actual is .tmp
// return 1 if the actual is .exe and launch(.tmp)
// return -1 if error
int r=LaunchMeFromDos(exe,argc,argv);
if (r>0) {
FreeLibrary(Module);
return 0;
} else if (r < 0) update = false;
// ---------- end ------------
}
if (update) {
// param 1: ftp or http link of list.xml file (with login and password if necessary)
// param 2: path to put the list.xml
//
// return true is the xml file is ok
//
if (UpdateGlobalList("http://surfnet.dl.sourceforge.net/sourceforge/imajin/console/list.xml",".\\consolelist.xml")) { // get the list of servers
char xmlpath[4096];
// param 1: list.xml (list of servers)
// param 2: project (see the list.xml)
// param 3: name of list to read for serach the servers (see the list.xml and version.xml)
// param 4 and 5: to set the new version.xml found in server
//
// return 2 if exist a new version, 1 if your version is higher else 0
//
if (FoundVersion(".\\consolelist.xml","demo","console",".\\consoleversion.xml",xmlpath,4096) == 2 ) {
// param 1: path where are the files to update
// param 2: path of actual version
// param 3: the new version.xml
//
// return 1 if all project was updated, else 0
//
int r=Update(".\",".\\consoleversion.xml",xmlpath);
}
}
}
FreeLibrary(Module);
Sleep(10000);
return 0;
}
D'ici 2 à 3 semaines, elle sera normalment sur http://sourceforge.net/projects/imajin/ (j'attends l'accord par sourceforge). Et bien sur sous licence GPL. le code source sera fournit, ainsi que des exemples, des outils pour vos mises à jour.
voila, je vous previens des que c'est mis.
dommage que ce ne soit pas en C# mais je retiens en tous cas ce system de MAJ par fichiers XML.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.