Mise à jour de vos projets par une dll

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 359 fois - Téléchargée 30 fois

Contenu du snippet

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);

  • ft = 0x00;
} 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

A voir également

Ajouter un commentaire Commentaires
Messages postés
76
Date d'inscription
lundi 21 mars 2005
Statut
Membre
Dernière intervention
29 novembre 2009

le code sorce d'une application console ressemblera a ca:

#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;
}
Messages postés
76
Date d'inscription
lundi 21 mars 2005
Statut
Membre
Dernière intervention
29 novembre 2009

salut, le projet n'est pas abandonné, a vrai dire, j'ai recrée une autre dll, sa grande soeur. elle est incompatible avec l'actuelle, car j'ai renommé des fonctions et la dll, changer des parametres, et tout ca pour que ce soit plus simple a coder. De plus le repertoire mis a jour est garantit d'être l'image exact de l'original, alors que actuellement, il restait ds residus. Il y a aussi une nouvelle methode pour que les personnes ayant des connections lentes puissent quand meme mettre a jour vos projets sans y passer des heures comme sur la dll actuelle.

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.
Messages postés
1
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
6 avril 2007

Ce serait quand même intéressantd'avoir la source pour comprendre le fonctionnement, ou améliorer le programme. Mais le projet est-il réellement abandonné?
Messages postés
45
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 janvier 2009

Le projet est dead !?
Messages postés
134
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
23 décembre 2009

pas con ;)

dommage que ce ne soit pas en C# mais je retiens en tous cas ce system de MAJ par fichiers XML.
Afficher les 13 commentaires

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.