2016-04-07 2 views
-3

ce programme est supposé écrire dans la mémoire partagée en utilisant win32 API. c'est un programme donné tel qu'il est dans le livre de texte mais quand j'essaye de l'exécuter il échoue. il se bloque que je clique sur exerceraile programme se bloque dès que j'exécute

le programme est censé écrire une chaîne à mémoire partagée

#include<windows.h> 
#include<stdio.h> 

int main(int argc, char *argv[]) 
{ 
    HANDLE hFile, hMapFile; 
    LPVOID lpMapAddress; 
    //mapping of memory 
    hFile=CreateFile("temp.txt",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);  
    hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0,0, TEXT("SharedObject")); 
    lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
    //writing into shared memory 
    sprintf((char*)lpMapAddress,"shared memory writing"); 


    UnmapViewOfFile(lpMapAddress); 
    CloseHandle(hFile); 
    CloseHandle(hMapFile); 
} 
+3

code avec un débogueur? depends.exe? Message d'erreur? – Ceros

+1

Vous n'avez pas besoin de mapper un fichier de> 0 octets pour les fichiers mappés en mémoire? Bien que la dernière fois que j'ai regardé des fichiers mappés en mémoire en utilisant WINAPI, c'était à la fin des années 1990. – drescherjm

+0

aucun message d'erreur n'est affiché. Il se bloque tout de suite @ceros –

Répondre

3

la raison pour laquelle il se bloque parce que le fichier doit être créé avec GENERIC_READ et GENERIC_WRITE les droits d'accès depuis la CreateFileMapping() fonction votre code spécifie PAGE_READWRITE comme son troisième argument (flProtect). Ceci est de la documentation MSDN de CreateFileMapping:

Le fichier doit être ouvert avec les droits d'accès qui sont compatibles avec les indicateurs de protection que le paramètre flProtect spécifie

PAGE_READWRITE => Donne accès en lecture/écriture à un particulier région des pages. Le fichier spécifié par hFile doit être créé avec les droits d'accès GENERIC_READ et GENERIC_WRITE.

donc changer

hFile=CreateFile("temp.txt",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);

à

hFile=CreateFile("temp.txt",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL); 

une chose que vous ne pouvez pas mapper un fichier avec une taille zéro. Voici de la documentation MSDN de CreateFileMapping() fonction:

Si ce paramètre (dwMaximumSizeLow) et dwMaximumSizeHigh sont 0 (zéro), la taille maximale de l'objet de mappage de fichier est égal à la taille actuelle du fichier que hFile identifie.

Une tentative de mappage d'un fichier avec une longueur de 0 (zéro) échoue avec un code d'erreur de ERROR_FILE_INVALID. Les applications doivent tester les fichiers ayant une longueur de 0 (zéro) et rejeter ces fichiers.

Si une application spécifie une taille de l'objet de mappage de fichier qui est plus grande que la taille du fichier nommé réel sur le disque, le fichier sur disque est augmentée pour correspondre à la taille spécifiée du mappage de fichier objet .

donc dans votre cas depuis le fichier que vous essayez de la carte a d'abord une taille de 0, la fonction CreateFileMapping() échouera sauf si vous spécifiez la taille d'un objet de mappage de fichier dans les paramètres de dwMaximumSizeLow/dwMaximumSizeHighCreateFileMapping(). Vous pourriez faire quelque chose comme ça ...

HANDLE hFile, hMapFile; 
    LPVOID lpMapAddress; 
//mapping of memory 
    hFile=CreateFile(L"temp.txt",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);  
    if(hFile!=INVALID_HANDLE_VALUE) 
    { 
     char* str="shared data to be written";//the data you want to write to the file 
     int strLen=::strlen(str);//get the string length of the data you want to write 
     hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0,strLen, TEXT("SharedObject")); //here you also specify the size of the mapping object to be equal to the size of data you want to write 
     if (hMapFile != NULL && hMapFile != INVALID_HANDLE_VALUE) 
     { 
      lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
      //writing into shared memory 

      if(lpMapAddress!=NULL) 
       sprintf((char*)lpMapAddress,"%s","shared file write"); 
      else 
       printf("error");//error message MapViewOfFile() failed 

      UnmapViewOfFile(lpMapAddress); 
      CloseHandle(hMapFile); 
     } 
     else 
      printf("error");//error message CreateFileMapping() failed 

     CloseHandle(hFile); 
    } 
    else 
     printf("error");//error message CreateFile() failed 
+0

j'ai déjà essayé cette déclaration mais le résultat est toujours le même !! –

+0

Je pense qu'il y a un problème avec l'instruction sprintf, quand je l'ai fatigué sans cette déclaration, le programme a fonctionné correctement –

+0

donc j'ai besoin d'un autre pour écrire dans la mémoire partagée –