begin process at 2012 05 27 18:42:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > MISE À JOUR DE VOS PROJETS PAR UNE DLL

MISE À JOUR DE VOS PROJETS PAR UNE DLL


 Information sur la source

Note :
9,67 / 10 - par 3 personnes
9,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Application Classé sous :update, mise, jour, projet Niveau :Débutant Date de création :26/01/2006 Date de mise à jour :29/01/2006 00:12:59 Vu :5 409

Auteur : darkpoulpo

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

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

  • 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;
  • }
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
co nsulter le fichier texte pour la documentation


 Historique

28 janvier 2006 15:05:46 :
correction de la dll et de l'exemple
29 janvier 2006 00:12:59 :
.

 Sources du même auteur

CONVERTIR CHEMIN RELATIF EN CHEMIN ABSOLUE (POUR DISQUE DUR)
SSCANF POUR SUPPRIMER DES ESPACES (COMME TRIM())
RECUPERER LE DNS DU SERVEUR MX MAIL D'UNE ADRESSE EMAIL
LISTE CHAINÉE (TEMPLATE, NOEUD LOCAL OU GLOBAL, INSERTION OU...
Source avec Zip ENCORE UN PARSER XML

 Sources de la même categorie

Source avec Zip Source avec une capture PROGRAMME DE SUDOKU par AffreuxJojp
Source avec Zip EVALUATEUR D'EXPRESSION ARITHMÉTIQUE par matrx180vTitanium
Source avec Zip Source avec une capture QBIBLIO GESTION DES PRÊTS par conatic
Source avec Zip Source avec une capture QL-CHATROOM V 1.0 par mature
Source avec Zip Source avec une capture GEOLOCALISATION par ganjarasta

 Sources en rapport avec celle ci

Source avec Zip JOUR DE NAISSANCE par fredg19
Source avec Zip PENDU SANS PRÉTENTION par dhuyp
Source avec une capture ALGORITHME DE MAURICE KRAITCHIK (1882&#65533;1957) par thebroyeur
JOUR A PARTIR D'UNE DATE MM/JJ/YYYY par elkasimi2007
Source avec Zip FÊTES SUR LE BUREAU par Arnaud16022

Commentaires et avis

Commentaire de darkpoulpo le 26/01/2006 20:39:12

pour faire du debug de votre projet, il vous suffit de mettre en commentaire la ligne suivante
/*
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;
        }
*/

Commentaire de darkpoulpo le 26/01/2006 20:55:45

le plus marrant, c'est de l'executer à partir d'un cmd
>demo.exe xxx yyy zzz

Commentaire de darkpoulpo le 27/01/2006 16:56:57

j'ai supprimé le lien le temps de corriger un bogue mais surtout parce que je suis en train de changer 2 ou 3 choses pour simplifier mais qui sont incompatibles avec les versions actuelles.

Commentaire de darkpoulpo le 28/01/2006 15:04:03

voila j'ai mis a jour la dll et l'exemple.

Commentaire de magic_Nono le 30/01/2006 07:52:57

ça a l'air fort intéressant, j'étudie ça dès que j'ai un peu de tps devant moi...
++

Commentaire de darkpoulpo le 31/01/2006 14:45:43

en cas de problème n'hesite pas à poser ta question.

Commentaire de cavalier92 le 02/02/2006 08:47:13

Pourquoi ne pas avoir posté le source de la DLL ?
J'ai visité ton site, mais sans succès. A-t-elle été retirée ? Je pense que celà m'aurait été très utile pour comprendre comment l'utiliser car je ne sais pas si une base de donnée doit être mise en place et la description des fichiers XML est trop succinte.
Bref, je serais très intéressé pour en savoir plus.

Commentaire de darkpoulpo le 03/02/2006 22:41:44

je n'ai pas mise la source de la dll parceque comme expliqué plus haut, elle peut avoir des mises à jour assez souvent, quand je jugerai que la version est tres tres complete, alors je mettrai la source.
tu mets une base de donnée si tu veux, du moment que tu donnes la sortie (l'affichage) que le dll attend. si c'est la conception du fichier xml qui te bloque, demande ce que tu voudrais faire, je te dirais quoi mettre dans ton xml.

mais je te donnes quelques explications sur le principe:

actuellement avec la version 1.4, 2 methodes:

1)imaginons que l'on met a jour un fichier X. on va dabord recuperer une liste de site pour connaitre la version des  fichiers (de ton projet) que chaque site propose (fichier list.php ).
ensuite pour chaque site proposé, il va recuperer le xml qui indique le numero de version (balise <info> ), si la version est superieur a celle qu'on a actuellement, alors il va telecharger le fichier (balise <donwload>) puis l'installer selon la balise enfant de <download> (balise <copy /> , <unzip /> , <launch /> ). si ce site a une version egal ou inférieur a la version actuelle, il passe au site suivant.

il est possible d'imbriquer des balises :

<download link="http://xxxxxxx/fichier.zip>
<unzip filter="executable.exe" rename="executable.exe">
<launch />
</unzip>
</download>

ici, on va telecharger le fichier.zip (dans un fichier tmp dans le repertoire temp de ton profil windows), <unzip> va le dezziper en ne decompressant que le fichier executable.exe et le renommer avec le meme nom dans le repertoire ou se trouve le fichier à mettre à jour (fournis en 1er paramettre de l'api) (ca permet d'indiquer a <launch> le nom du fichier a lancer, car il est determiné par le parametre "rename"). <launch> va donc ensuite lancer le fichier.

2) la seconde methode permet de ne pas passer par une liste de serveur, mais permet d'indiquer directement dan sle fichier ou se trouve la version du fichier ou chercher la nouvelle version. la difference c'est que tout est indiquer dans un meme fichier xml. un exemple concret, je fais une application qui permet de lire des dll pour faire des plugins. si quelqu'un veut creer son propre plugin, il pourra mettre dans son fichier xml qui accompagne sa dll, les balises qui sont normalement dans le fichier list.php, pour indiquer son site personnel. ca permet ainsi de ne pas declarer sur mon site, le lien pour la mise à jour de son plugin.

c'est clair?

Commentaire de gomoz le 18/03/2006 02:26:39

pas con ;)

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

Commentaire de Mini92 le 31/01/2007 15:30:39

Le projet est dead !?

Commentaire de dourouc05 le 06/04/2007 19:13:52

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é?

Commentaire de darkpoulpo le 31/07/2007 00:37:18

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.

Commentaire de darkpoulpo le 31/07/2007 00:49:04

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Un projet I.A en C++!!!!!!!!!!!!!!! [ par armand44 ] Sur le frere de ce site en VB ils ont commencés un projet en VB pour une I.A "les nurmites" sa serait cool que ici vous en fassiez un pour voir qui fe Dev d'un projet en c++ [ par mc.solaar3 ] J'ai envie de faire un projet c++, qui permet de chercher la voiture correspondant le mieux aux préférence de l'utilisateur : (prix, sécurité, comfort DEV d'un projet c++ [ par mc.solaar3 ] Je tente de créer un programme qui constituerait un guide d'achat automobiles. Ce programme tiendra compte de nombreuses données et de nombreuses pré soft : catalogue automobile [ par mc.solaar3 ] Je tente de créer un programme qui constituerait un guide d'achat automobiles. Ce programme tiendra compte de nombreuses données et de nombreuses préf Projet : voice-chat [ par Bog. ] Salut, comme le sujet de ce message l'indique, je voudrais réaliser un programme de communication vocale (voice-chat) destiné au reseau internet. Etan Composant COM [ par kawazaki ] Salut a tous et a toutes Je commence a développer un composant COM en Visual C++ (ATL) permet de gérer les accés simultanées aux produits, dans les s problèmes liens entre fichiers C et C++ dans un projet Visual C++ 6.0 [ par nico ] J'ai récupéré un projet contenant des fichiers écrits en C. Le fichier "principal" de ce projet également écrit en C fait appel à des fonctions se tro Qui à l'intention de créer un projet simple sur les base de données ? [ par Lallthis ] Le genre de projet où on ouvre un base, on écris dedans,et on recherche un élément. XML en C++ [ par The_Legacy ] Bonjour tout le monde,Je fais appel à votre aide car je suis dans un cas désespéré. Je ne suis pas un pro du C++, disons que je m'en sors, mais je doi Comment joindre des fichiers sources à un projet existant? [ par abba ] Salut, Comment joindre des fichiers sources à un projet existant?ex: source.cpp et source.h à ajouter à mon projet.@+


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,434 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales