CreateFileMapping () – parametrar av storlek
On februari 10, 2021 by adminJag vill skapa ett program som kommer att lägga en mening i delat minne så att ett annat program får denna massage. Jag gjorde det, men jag förstår inte de fjärde och femte parametrarna i CreateFileMapping ().
I mitt program skriver jag 256 (5: e parameter), men när jag ändrade detta till 1 fungerade programmet fortfarande. Jag trodde att det skulle krascha, för jag antar att dwMaximumSizeLow är den lägsta storleken. När jag lägger lite värde i fjärde argumentet kraschar programmet. Jag trodde att detta värde borde vara högre än femte, men jag hade fel.
Min kod:
#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; }
Kan du förklara hur den 4: e och femte parametrarna för CreateFileMapping () fungerar?
Kommentarer
- Frågar du oss att hitta Microsoft ' s dokumentation för denna funktion åt dig? (det här är enkelt för Google) Eller en förklaring av vad vissa delar av dokumentationen betyder? (kan du inkludera citat av exakta delar som du inte kunde ' inte förstår? Jag kunde gissa, men jag ' gissar antagligen fel) Förstå inte ' t hur detta kodavsnitt är relevant för din fråga om du ' bara frågar om hur en enda funktion fungerar.
- Jag frågar om 4: e och 5: e parametrarna för CreateFileMapping (), eftersom jag inte ' inte förstår hur det fungerar. Från dokumentation trodde jag att dwMaximumSizeHigh är den högsta storleken på data i delat minne och dwMaximumSizeLow är den lägsta storleken på data. Så jag ville kontrollera hur det fungerar och jag ändrade värde i femte parametrarna på ett program som fortfarande fungerade. Och jag vet inte ' varför, så det är så att programmet i lägsta storlek ska krascha.
Svar
-dokumentationen förklarar mycket bra de fjärde och femte parametrarna, dwMaximumSizeHigh
och dwMaximumSizeLow
. De är dock inte den högsta och lägsta möjliga storleken på data, som du förutspår. De är av hög ordning och låg ordning av samma, var och en en 32-bitars del av 64 bitars storlek:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Så om du lägger till 256 i båda dessa värden blir ditt delade minne 256 * 4294967295 + 256 = 1 099 511 627 776 byte! Att ”kommer att vara 1099 GB. Är du säker på att du har kapacitet för det?
Varför kraschar det inte om storleken på det delade minnet är för liten?
När du minskar storleken till 1 och skriver fler byte till det delade minnet kan du potentiellt skada minnet. Det kan förbli obemärkt.
Det kraschar inte, säkert för att segfel upptäcks via personsökarsystemet, och en vanlig sida på Windows är 4Kb. Ditt exempelmeddelande är för litet för att personsökarsystemet ska märka att den begärda adressen går utanför gränserna.
Kommentarer
- Microsoft-dokumentationen är inte tydlig för mig medan det här svaret klargör vad hög-och låg-ordning är.
Lämna ett svar