Structure et FileMapping

Résolu
Loukhass Messages postés 20 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 31 mars 2006 - 8 mars 2006 à 14:03
Loukhass Messages postés 20 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 31 mars 2006 - 8 mars 2006 à 16:15
Bonjour. Je dois utiliser le filemapping pour transmettre un tableau de structure d'un programme à un autre.



Mon premier probleme était le fileMapping. Mais j'ai trouvé un code sur
le net qui permettait de passer des tableaux d'entier d'un programme a
un autre. J'ai modifié le programme de façon a ce qu'a la place,
d'entier, le tableau contienne des structures.



La compilation passe très bien, mais il y a une erreur à l'execution. Je ne vois pas d'ou elle peut venir... Voici mon code:





#define MAXMEMORY 2



//Structure décrivant un avatar

typedef struct t_avatar {

string idSelection; //Id du personnage

int posX;
//Absisse de
la position du personnage

int posY;
//Ordonnée de
la position du personnage

int
Orientation; //Orientation de la
position du personnage

};



//structure a transmettre

struct MEMORYDATA

{

t_avatar data[MAXMEMORY];

};





int main(int argc, char* argv[])

{

//Declaration des variables

HANDLE fileHandle;

HANDLE mapFileHandle;

struct MEMORYDATA *mdata = NULL;



t_avatar Avatar1;

t_avatar Avatar2;



//Initialisation des variable avec des valeur bidon. L'important, c'est que ca marche!

Avatar1.idSelection = "Av1";

Avatar1.Orientation = 2;

Avatar1.posX = 3;

Avatar1.posY = 4;



Avatar2.idSelection = "Av2";

Avatar2.Orientation = 5;

Avatar2.posX = 6;

Avatar2.posY = 7;



//Creation du fichier Map

fileHandle = CreateFile("C:\\Essai2.dat",
GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
CREATE_ALWAYS, 0, 0);

mapFileHandle = CreateFileMapping(fileHandle , 0, PAGE_READWRITE, 0,0x1E8480, "TEST");



//Création de la vue du fichier.

mdata = (struct MEMORYDATA*)MapViewOfFile(mapFileHandle, FILE_MAP_WRITE, 0, 0,0);



//C'est dans ces deux lignes qu'il y a des problemes a l'execution.

mdata->data[0] = Avatar1;

mdata->data[1] = Avatar2;



//Fermeture des fichier et libération de la mémoire

UnmapViewOfFile(mdata);

CloseHandle(mapFileHandle);

CloseHandle(fileHandle);



return 0;

}



Voyez vous d'ou peux venir l'erreur?

8 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 mars 2006 à 16:04
LPVOID pmem;
....
pmem = MapViewOfFile(...);
et par exemple:
memcpy(pmem, &Avatar1, sizeof(t_avatar));

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 mars 2006 à 14:28
avec 'string' dans struct, ça copiera quoi dans le fichier ???

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
Loukhass Messages postés 20 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 31 mars 2006
8 mars 2006 à 14:49
Comment ca?



C'est le tableau d'avatar que j'essaye de passer entre les deux programmes
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 mars 2006 à 14:53
Pas d'adresses entre 2 processus.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0

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

Posez votre question
Loukhass Messages postés 20 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 31 mars 2006
8 mars 2006 à 14:59
Donc selon toi, il n'y a pas de solution a ce que j'essaye de faire?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 mars 2006 à 15:15
ah si, virer ces 'string' à la c.., mettre "char truc[xxx]" dans la struct et écrire les données par memcpy sur le pointeur de filemapping.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
Loukhass Messages postés 20 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 31 mars 2006
8 mars 2006 à 15:27
Tu veux dire faire un truc dans le genre:



typedef struct t_avatar {

char idSelection[10]; //Id du personnage

int posX;
//Absisse de
la position du personnage

int posY;
//Ordonnée de
la position du personnage

int
Orientation; //Orientation de la
position du personnage

};

struct MEMORYDATA

{

t_avatar data[MAXMEMORY];

};



puis dans mon programme, je met ca:

mdata = (struct MEMORYDATA*)MapViewOfFile(mapFileHandle, FILE_MAP_WRITE, 0, 0,0);



memcpy(mdata->data[0].idSelection,"Av1", sizeof("Av1"));

mdata->data[0] = Avatar1;



c'est ca?
0
Loukhass Messages postés 20 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 31 mars 2006
8 mars 2006 à 16:15
Ca marche!



Merci beaucoup!
0
Rejoignez-nous