Partage mémoire entre programme c++

jcloupgarou Messages postés 22 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 19 juillet 2006 - 15 févr. 2006 à 10:00
jcloupgarou Messages postés 22 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 19 juillet 2006 - 16 févr. 2006 à 15:32
bonjour,

J'ai deux programmes en c++ : une appli A de modélisation 3d et une appli B permettant de charger un fichier de type Step (catia). L'appli A execute l'appli B avec "createProcess()" et je voudrais que l'appli B avant de se terminer communique à l'appli A le contenu d'une variable de type Objet.
Je pense que les "file mapping" sont une solution, mais je n'arrive pas à m'en sortir...

J'écris dans la mémoire au sein de l'appli B :
Appli B :
HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,0x400000,"filemap");
Objet* mData = (OCCGeometry*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
UnmapViewOfFile(mData);
CloseHandle(hFileMap);

J'execute l'appli B depuis l'appli A et je tente de lire dans le fichier mappé (en rouge):
Appli A :
PROCESS_INFORMATION Process;
STARTUPINFO StartInfo;
memset(&StartInfo, 0, sizeof(StartInfo));
StartInfo.cb = sizeof(StartInfo);
if(!CreateProcess(NULL,"Appli B", NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL,
&StartInfo, &Process))
{
// Erreur au lancement du programme
}


//Attente de la fin du programme de l'appli B
WaitForSingleObject(Process.hProcess, INFINITE);

//Lecture du fichier mappé
HANDLE filOpen = OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE, "filemap");
Objet* mData = (Objet*)MapViewOfFile(filOpen,FILE_MAP_ALL_ACCESS,0,0,0);


Objet* geometry = mData;
UnmapViewOfFile(mData);
CloseHandle(filOpen);

-> L'écriture dans le fichier partagée semble fonctionner, mais je n'arrive pas à le lire avec l'appli A et à récupérer le contenu de la variable Objet. Ca fait plusieurs jours que je bloque sur ce probleme, j'ai besoin de votre aide.
Comment lire dans le fichier mappé ? Existe-t-il une autre solution plus évidente dans mon cas ?
Merci pour tout, bonne journée.
Jc.

10 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 févr. 2006 à 10:12
Si est process A qui lance B alors c'est A qui crée le filemap et B fait un Open pour écrire dedans.

Exemple ici:
http://www.cppfrance.com/code.aspx?ID=25238

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
jcloupgarou Messages postés 22 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 19 juillet 2006
15 févr. 2006 à 11:23
Merci pour l'ordre de creation ! Quant à l'exemple, excuse moi du peu, mais je ne comprends pas vraiment...
Ce serait possible d'avoir un exemple personnalisé ? J'ai modifié la création du fichier dans l'appli A, l'ecriture dans le fichier mappé est ok, mais je n'arrive toujours pas à lire les infos contenus dans ce fichier avec l'appli A une fois que l'appli B est terminé.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 févr. 2006 à 11:53
HANDLE hmap; // dans process A


Process A démarre.
hmap = CreateFileMapping(...);
A lance process B.


-------
Dans process B:
HANDLE hmapb;
LPVOID pmem;
hmapb = OpenFileMapping(...);
pmem = MapViewOfFile(...);
Ecriture des données sur pmem
UnmapViewOfFile(pmem);
CloseHandle(hmapb);
Avertir process A par PostMessaage par exemple.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
jcloupgarou Messages postés 22 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 19 juillet 2006
15 févr. 2006 à 13:51
Et tu utilises aussi MapViewOfFile(...); dans le process A pour lire les données inscrites dans le fichier map ?
Pour le reste je crois avoir compris, merci beaucoup de me me filer un coup de main !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 févr. 2006 à 14:03
MapViewOfFile aussi pour écrire depuis A.
MapViewOfFile() obtient pointeur mémoire pour lecture et/ou écriture, suffit de modifer les flags de paramètre.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
jcloupgarou Messages postés 22 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 19 juillet 2006
15 févr. 2006 à 14:26
Ok j'avais pas compris cette subtilité dans la msdn. J'ai corrigé, toujours pas de lecture. Voici un ptit test pour voir si j'ai compris... Je simule dans un prog l'ouverture ecriture, puis lecture dans un fichier mappé pour résumé.

//ouverture du fichier map "filemap"
HANDLE hmapb = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,0x2000000,"filemap");
OCCGeometry* pmem;
pmem = (OCCGeometry*)MapViewOfFile(hmapb,FILE_MAP_WRITE,0,0,0);
pmem = occgeometry; //je mets l'objet occgeometry de classe OCCGeometry* dans le fichier map
UnmapViewOfFile(pmem);
CloseHandle(hmapb);

//ouverture du fichier map "filemap" en lecture
HANDLE hmapb2 = OpenFileMapping(FILE_MAP_READ, TRUE, "filemap");
OCCGeometry* pmem2;
pmem2 = (OCCGeometry*)MapViewOfFile(hmapb2,FILE_MAP_READ,0,0,0); //lecture de la valeur contenu en memoire

OCCGeometry * occgeometry = pmem2; //occgeometry ne contiendra pas les données...

UnmapViewOfFile(pmem2);
CloseHandle(hmapb2);

J'ai pas un probleme d'adressage ou un truc comme ca (pointeur/adresse...). Je suis un peu paumé...
Merci.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 févr. 2006 à 14:50
pmem = occgeometry;
tu changes l'adresse du pointeur mais en aucun cas ça n'écrit, faut revoir aussi les bases du C.

*pmem = occgeometry; // ici 4 octets écrits à l'adresse du pointeur

exemples dans Richter, chapitre 17
http://brunews.free.fr/brunews/download/JR4.zip
http://brunews.free.fr/brunews/download/JR4Sources.zip

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
jcloupgarou Messages postés 22 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 19 juillet 2006
15 févr. 2006 à 14:56
Avec une ptite correction au niveau de mes pointeurs, et en gardant ouvert le fichier mappé, ca marche, mais je suis loin de ce que je veux faire...

HANDLE hmapb = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,0x2000000,"filemap");
OCCGeometry** pmem;
pmem = (OCCGeometry**)MapViewOfFile(hmapb,FILE_MAP_WRITE,0,0,0);
*pmem = occgeometry; //Ecriture
UnmapViewOfFile(*pmem);
//CloseHandle(hmapb);

//HANDLE hmapb2 = OpenFileMapping(FILE_MAP_READ, TRUE, "filemap");
OCCGeometry** pmem2; //Lecture
pmem2 = (OCCGeometry**)MapViewOfFile(hmapb,FILE_MAP_READ,0,0,0);
//pmem2 = (OCCGeometry**)MapViewOfFile(hmapb2,FILE_MAP_READ,0,0,0);
occgeometry = *pmem2; //Bonne valeur dans occgeometry
UnmapViewOfFile(*pmem2);
CloseHandle(hmapb);

Dés que je ferme le fichier, et que j'utilise MapViewOfFile(FILE_MAP_READ) pour le réouvrir (en bleu), ca foire, je n'accède pas au bon contenu...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 févr. 2006 à 15:33
tu mets 4 octets dans le fichier et de plus tu enregistres une adresse, par force une adresse d'un processus est totalement invalide dans un autre processus.
Tu dois enregistrer des données et non des adresses.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
jcloupgarou Messages postés 22 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 19 juillet 2006
16 févr. 2006 à 15:32
Ola, je ne m'en suis pas sorti avec ces fichiers mappés... Ca marche pour un int, mais en ce qui concerne mes objets de classe X, ca ne passe pas. Je pense être limité au niveau de la taille mémoire allouable, ca qui pose des problemes vu que je bosse avec des formes 3D qui peuvent prendre pas mal de place. Enfin, si tu as une idée...!
Bonne fin de journée.
Jc.
0
Rejoignez-nous