begin process at 2012 05 27 17:40:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > PARTAGE DE VARIABLE ENTRE PLUSIEUR PROGRAMMES (FILEMAPPING)

PARTAGE DE VARIABLE ENTRE PLUSIEUR PROGRAMMES (FILEMAPPING)


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Niveau :Débutant Date de création :10/06/2003 Date de mise à jour :15/06/2003 13:10:53 Vu :5 065

Auteur : Bub325

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

 Description

Ce code est seulement un petit exemple de partage d'une variable entre plusieur programme sous windows.

pour les tester il suffit d'en lancer plusieur et de taper un mot ou un nombre pour le mettre dans la variable partagée, PRINT ou 0 pour afficher cette dernière et EXIT ou 0 pour sortir.

Source

  • //////////////////////////////////////////////////////////////////////////////
  • // Premier exemple avec un partage d'une chaine de caractère
  • //////////////////////////////////////////////////////////////////////////////
  • #include <stdio.h>
  • #include <string.h>
  • #include <windows.h> // à ajouter pour l'utilisation
  • int main()
  • {
  • //Creation d'un fichier MAP (nommé "filemap" dans cet exemple)
  • HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,0x4000,"filemap");
  • // et initialisation d'une variable partagée
  • char* mData = (char*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
  • //initialise la variable au départ
  • strcpy(mData,"NO_DATA");
  • while (true)
  • {
  • char txt[0xFF];
  • scanf("%s",&txt);
  • if (strcmp(txt,"PRINT") == 0) // Si je tape PRINT: affiche la variable partagée
  • printf("mData: %s\n",mData);
  • else if(strcmp(txt,"EXIT") == 0) // Si EXIT: quitte la boucle infinie
  • break;
  • else // sinon enregistre ce qu'on a tapé dans la variable partagée
  • strcpy(mData,txt);
  • }
  • // Libère la mémoire et quitte le programme
  • UnmapViewOfFile(mData);
  • CloseHandle(hFileMap);
  • return 0;
  • }
  • //////////////////////////////////////////////////////////////////////////////
  • // Second exemple avec un partage d'un nombre de type 'int'
  • //////////////////////////////////////////////////////////////////////////////
  • #include <stdio.h>
  • #include <string.h>
  • #include <windows.h>
  • int main()
  • {
  • HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,0x4000,"filemap");
  • int* mData = (int*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
  • *mData = 4;
  • while (true)
  • {
  • int txt;
  • scanf("%d",&txt);
  • if (txt == 0)
  • printf("mData: %d\n",*mData);
  • else if (txt == 1)
  • break;
  • else
  • *mData = txt;
  • }
  • UnmapViewOfFile(mData);
  • CloseHandle(hFileMap);
  • return 0;
  • }
//////////////////////////////////////////////////////////////////////////////
// Premier exemple avec un partage d'une chaine de caractère
//////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <windows.h> // à ajouter pour l'utilisation

int main()
{
	//Creation d'un fichier MAP (nommé "filemap" dans cet exemple)
	HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,0x4000,"filemap");
	// et initialisation d'une variable partagée
	char* mData = (char*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
	//initialise la variable au départ
	strcpy(mData,"NO_DATA");

	while (true)
	{
		char txt[0xFF];
		scanf("%s",&txt);

		if (strcmp(txt,"PRINT") == 0) // Si je tape PRINT: affiche la variable partagée
			printf("mData: %s\n",mData); 
		else if(strcmp(txt,"EXIT") == 0) // Si EXIT: quitte la boucle infinie
			break;
		else // sinon enregistre ce qu'on a tapé dans la variable partagée
			strcpy(mData,txt);
	}
	// Libère la mémoire et quitte le programme
	UnmapViewOfFile(mData);
	CloseHandle(hFileMap);

	return 0;
}



//////////////////////////////////////////////////////////////////////////////
// Second exemple avec un partage d'un nombre de type 'int'
//////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <windows.h>

int main()
{
	HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,0x4000,"filemap");
	int* mData = (int*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);

	*mData = 4;

	while (true)
	{
		int txt;
		scanf("%d",&txt);

		if (txt == 0)
			printf("mData: %d\n",*mData);
		else if (txt == 1)
			break;
		else
			*mData = txt;
	}
	UnmapViewOfFile(mData);
	CloseHandle(hFileMap);

	return 0;
}

 

 Conclusion

Voici un code que l'on ma demandé donc donnez m'en des nouvelles pour me dire s'il répond à vos attentes. (Toutes critiques et note seront les bien venues)

Merci.

Bub325


 Sources du même auteur

Source avec Zip BUBSOCKCPP.H: OBJET SOCKET TRÈS SIMPLE D'UTILISATION
Source avec Zip NAVAL_FLEET325 -&GT; COMBAT D'IA
Source avec Zip MORPION325 -&GT; COMBAT D'IA
Source avec Zip BUBSOCK.H: LES SOCKET DEVIENNENT SIMPLES

 Sources de la même categorie

Source avec Zip Source avec une capture EVAL EXPRESSION COMPLEXE EN 15 LIGNES DE CODE par yann_lo_san
Source avec Zip SCHEDULER RR FIFO par yvesB87
Source avec Zip ALGORITHMES RÉCURSIFS VS ALGORITHMES ITÉRATIFS par yvesB87
Source avec Zip Source avec une capture C++ FORMAT D'IMAGE AVEC QT par pop70
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70

Commentaires et avis

Commentaire de fredcl le 10/06/2003 19:45:12

interressant, je ne connaissait pas cela. Va falloir que j'explore un peu plus les possibilitées de cette chose. Merci

Commentaire de cmarsc le 11/06/2003 11:20:31

salut,
tu utilises les fonctions comme strcpy strcmp sans inclure &lt;string.h&gt;

Commentaire de Bub325 le 11/06/2003 21:10:37

Et bien sachant que windows.h est déclaré, je n'ai plus besoin d'inclure string.h =)

Commentaire de cmarsc le 13/06/2003 10:28:07

il y a une bibliothèque spécifique pour strcpy strcmp strcat etc et dans mon &lt;windows.h&gt; &lt;string.h&gt; n'est pas présent, je pense surtout que ton compilateur comme un certains nombres corrigent le tire tout seul sans emettre de message d'erreur. ;-)

Commentaire de Bub325 le 15/06/2003 13:07:25

c'est donc effectivement possible wi, je vais donc corriger le tir =)

Merci

Commentaire de piloulette le 06/12/2004 12:14:57

Tres interessant, je cherchais à partager des données entre un exe en C et un exe en Java sous Windows et bien ça marche (on peut meme mettre le code dans une DLL).
En plus c'est facile à faire, je vais creuser un peu pour comprendre comment ça marche.
Juste quelques questions:
-Est ce gourmant en ressources: temps CPU, memoires, acces disque ?
-Y a t il des restrictions dans l'utilisation ?
-Y a t il des inconvenients par rapport à DDE (au quel je ne connais rien, mais qui m'a l'air beaucoup plus compliqué à mettre en oeuvre) ?

Commentaire de JoebarGlut le 21/11/2005 18:43:24

simple et efficace, cool :)

Commentaire de matsky le 13/07/2006 05:31:14

Dans l'optique de Piloulette.
Ma question est courte :
Un process ou une dépendance(dll) démarrer en tant que service interactif va t-il partager ce "fichier" avec un process ou une dll ayant un jeton utlisateur/administrateur ?

@+ Matsky

Commentaire de f_james le 01/08/2006 18:36:27

bonjour,

il y a quelqu'un qui peut me dire comment partager une structure de données (une file d'attente par exemple) à la place d'une variable normale (comme c'était le cas pour "mData") ?

Merci !
James.

Commentaire de jjmaster le 24/07/2007 09:41:26

Merci beaucoup, Tout a fait ce que je cherchais.
Encore merci et bonne continuation

Commentaire de deck_bsd le 22/10/2007 19:52:16

A ton avis JJMASTER ?

struct tastruct* mData = (struct tastruct*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);

Me parait une bonne solution non? tt simple.

Commentaire de thomas50000 le 07/04/2010 11:21:32

hmmm je crois qu il y a un bug
pour le 2 eme process c pas plutot un OPENFILEMAPPING ?

Commentaire de adaddu41 le 10/05/2011 16:42:34

Bonjour,
En effet cette technique fonctionne bien entre deux applications C++
Mais y'a t'il moyen de récupérer ce filemap par un script? ou est-ce strictement limité au C et codes bas niveau

Commentaire de deck_bsd le 14/05/2011 14:48:24

Plus haut il est mis que ça a été testé entre C et Java , Java n'étant pas du code bas niveau tu as ta réponse. Pour ce qui est du scripting, je ne saurais dire. Mais à mon humble avis non.

 Ajouter un commentaire




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 : 0,546 sec (3)

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