jcloupgarou
Messages postés22Date d'inscriptionmardi 6 décembre 2005StatutMembreDernière intervention19 juillet 2006
-
15 févr. 2006 à 10:00
jcloupgarou
Messages postés22Date d'inscriptionmardi 6 décembre 2005StatutMembreDernière intervention19 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);
-> 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.
jcloupgarou
Messages postés22Date d'inscriptionmardi 6 décembre 2005StatutMembreDernière intervention19 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é.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
jcloupgarou
Messages postés22Date d'inscriptionmardi 6 décembre 2005StatutMembreDernière intervention19 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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
jcloupgarou
Messages postés22Date d'inscriptionmardi 6 décembre 2005StatutMembreDernière intervention19 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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
jcloupgarou
Messages postés22Date d'inscriptionmardi 6 décembre 2005StatutMembreDernière intervention19 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.