CreateFileMapping () – paramètres de taille
On février 10, 2021 by adminJe veux créer un programme qui mettra une phrase en mémoire partagée pour quun autre programme reçoive ce massage. Jai fait ça, mais je ne comprends pas les 4ème et 5ème paramètres de CreateFileMapping ().
Dans mon programme, jécris 256 (5ème paramètre), mais quand je lai changé en 1, le programme fonctionnait toujours. Jai pensé quil devrait planter, car je suppose que dwMaximumSizeLow est la taille la plus basse. Quand je mets une valeur dans le 4e argument, le programme plante. Je pensais que cette valeur devrait être plus élevée le 5, mais je me suis trompé.
Mon code:
#include <iostream> #include <Windows.h> const char name[256] = "Map1"; const char massage[256] = "Welcome in the world without rules"; int main() { using std::cout; using std::cin; using std::endl; HANDLE hMap; hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 256, (LPCTSTR)name); if (!hMap) { cout << "create error" << endl; return 1; } char * data = (char*) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, NULL, NULL,NULL); if (!data) { cout << "mapview error" << endl; return 1; } if (!(CopyMemory(data, massage, sizeof(char) * 256)) ) { cout << "copy error" << endl; } cin.get(); UnmapViewOfFile(hMap); CloseHandle(hMap); return 0; }
Pourriez-vous expliquer comment le 4 et 5ème paramètres de CreateFileMapping () fonctionnent?
Commentaires
- Vous nous demandez de trouver Microsoft ' documentation de cette fonction pour vous? (cest facile pour Google) Ou une explication de ce que signifient certaines parties de la documentation? (pourriez-vous inclure des citations des parties exactes que vous ne pourriez ' comprendre? Je pourrais deviner, mais je ' devinerais probablement mal) I ' ne comprenez pas non plus en quoi cet extrait de code est pertinent pour votre question si vous ' ne demandez que le fonctionnement dune seule fonction.
- Je pose des questions sur les 4e et 5e paramètres de CreateFileMapping (), car je ne comprends pas ' comment cela fonctionne. Daprès la documentation, je pensais que dwMaximumSizeHigh était la plus grande taille de données dans la mémoire partagée et dwMaximumSizeLow était la plus petite taille de données. Jai donc voulu vérifier comment cela fonctionne et jai changé la valeur des 5èmes paramètres sur 1 programme qui fonctionnait toujours. Et je ne ' ne sais pas pourquoi, car cest donc le programme de plus petite taille qui devrait planter.
Réponse
La documentation explique très bien les 4ème et 5ème paramètres, dwMaximumSizeHigh
et dwMaximumSizeLow
. Ils ne sont cependant pas la taille la plus élevée et la plus petite possible des données, comme vous lexprimez. Il sagit de la partie de poids fort et de la partie de poids faible de la même chose, chacune faisant partie 32 bits de la taille 64 bits:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Donc, si vous mettez 256 dans ces deux valeurs, votre mémoire partagée sera de 256 * 4294967295 + 256 = 1 099 511 627 776 octets! Cela « fera 1099 Go. Êtes-vous sûr que vous avez la capacité pour cela?
Pourquoi ne plante-t-il pas si la taille de la mémoire partagée est trop petit?
Lorsque vous réduisez la taille à 1 et écrivez plus doctets dans la mémoire partagée, vous risquez de corrompre la mémoire. Cela pourrait rester inaperçu.
Il ne plante pas, certainement parce que les défauts de segmentation sont détectés via le système de pagination, et une page typique sous Windows fait 4 Ko. Votre exemple de message est trop petit pour que le système de pagination remarque que ladresse demandée va hors des limites.
Commentaires
- La documentation Microsoft nest pas claire pour moi alors que cette réponse clarifie ce que sont les ordres supérieurs et inférieurs. / li>
Laisser un commentaire