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/dwMaximumSizeHigh
CreateFileMapping()
. 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
code avec un débogueur? depends.exe? Message d'erreur? – Ceros
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
aucun message d'erreur n'est affiché. Il se bloque tout de suite @ceros –