2009-04-21 5 views
-1

Dans mon projet, j'ai implémenté le concept CreateFileMapping pour partager de la mémoire entre deux processus. J'ai un processus de serveur dans lequel je stocke l'adresse de mémoire de mes données de session, qui contient des détails au sujet d'une image particulière. Et j'ai un processus de client dans lequel j'ai lu cette adresse du tampon. Maintenant le problème est l'adresse est montrée dans le processus de client mais quelques détails manquent.Erreur lors de l'utilisation de Windows CreateFilemapping

Ceci est mon code de processus serveur:

HANDLE hMem; 
LPCSTR pBuf; 
#define BUF_SIZE 1024 
static const char MemoryName[]="Share Memory Name"; 

hMem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL, PAGE_READWRITE,0, BUF_SIZE, MemoryName); 
pBuf = (LPCSTR) MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE); 
CopyMemory((PVOID)pBuf, session, BUF_SIZE); 
LtEntity test = LtEntity(pBuf); 

Ceci est mon code de processus client:

HANDLE hMem; 
LPCSTR pBuf; 
#define BUF_SIZE 1024 
static const char MemoryName[]="Share Memory Name"; 

hMem = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, MemoryName); 
pBuf = (LPCSTR) MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);     
LtEntity test = LtEntity(pBuf); 

Dans le processus de serveur la variable "test" contient tous les détails, mais dans le client « test "a des données manquantes.

La variable de test du serveur ci-dessous montre l'image ci-jointe qui montre le contenu de la variable.

La variable de test client ci-dessous montre l'image ci-jointe qui montre le contenu de la variable.

S'il vous plaît faire vérifier la différence i besoin des données de l'élément aussi visible dans mon processus client ..

Répondre

0

Vous avez probablement pointeurs/références dans LtEntity qui ne sont pas sérialisé, aussi.

Peut-être que vous pouvez donner plus d'informations sur LtEntity et dont les données sont manquantes.

1

quelques détails manquent

Vous pouvez le dire. Quelle est la définition de LtEntity?

Le mappage de fichier contient-il des pointeurs incorporés? Cela ne fonctionnera pas, car la mémoire partagée n'aura pas nécessairement la même adresse virtuelle dans chaque processus. Et ils ne fonctionneront pas s'ils pointent en dehors du mappage de fichier, même si la mémoire partagée a eu la même adresse virtuelle dans chaque processus. Au lieu de pointeurs, vous devez stocker les décalages depuis le début du mappage de fichier.

Les deux processus s'exécutent-ils dans la même session de connexion? Sinon, vous devez ajouter le Global\ prefix au nom du mappage de fichier.

En outre, vous devez utiliser INVALID_HANDLE_VALUE, non (HANDLE)0xFFFFFFFFF. La définition de a été modifiée lors de l'ajout de Windows 64 bits.

Vous pouvez utiliser LtEntity test(pBuf); au lieu de LtEntity test = LtEntity(pBuf);.

1

Si vous avez des pointeurs dans LtEntity il ne fonctionnera pas, comme le bloc de mémoire mappée dans chaque processus commence généralement à une adresse différente. Essayez d'utiliser Boost :: interprocess offset pointers, qui stocke les adresses relatives à la place.

+0

+1 pour recommander Boost :: interprocess. Ne jouez pas avec les détails à faible niveau d'erreur si vous pouvez utiliser une belle abstraction (bien testée). – lothar

Questions connexes