CreateFileMapping () – parametere med størrelse
On februar 10, 2021 by adminJeg vil lage et program, som vil sette noen setninger i delt minne, slik at et annet program vil motta denne massasjen. Jeg laget det, men jeg forstår ikke de fjerde og femte parameterne for CreateFileMapping ().
I programmet mitt skriver jeg 256 (5. parameter), men da jeg endret dette til 1, fungerte programmet fremdeles. Jeg trodde det skulle krasje, fordi jeg antar at dwMaximumSizeLow er den laveste størrelsen. Når jeg legger noen verdi i 4. argument krasjer programmet. Jeg trodde denne verdien skulle være høyere den 5., men jeg tok feil.
Koden min:
#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 forklare hvordan den fjerde og 5. parametere for CreateFileMapping () fungerer?
Kommentarer
- Ber du oss om å finne Microsoft ' dokumentasjon av denne funksjonen for deg? (dette er enkelt å Google) Eller en forklaring på hva visse deler av dokumentasjonen betyr? (kan du inkludere anførselstegn av de nøyaktige delene du ikke kunne ' ikke forstår? Jeg kunne gjette, men jeg ' antar sannsynligvis feil) Jeg Forstår ikke ' t hvordan denne kodebiten er relevant for spørsmålet ditt hvis du ' bare spør om hvordan en enkelt funksjon fungerer.
- Jeg spør om 4. og 5. parameter for CreateFileMapping (), fordi jeg ikke ' ikke forstår hvordan det fungerer. Fra dokumentasjon trodde jeg at dwMaximumSizeHigh er den høyeste størrelsen på data i delt minne og dwMaximumSizeLow er den laveste størrelsen på data. Så jeg ønsket å sjekke hvordan det fungerer, og jeg endret verdi i 5. parametere på 1 program som fremdeles fungerte. Og jeg vet ikke ' hvorfor, for så er det programmet med laveste størrelse som skulle krasje.
Svar
dokumentasjonen forklarer veldig godt 4. og 5. parameter, dwMaximumSizeHigh
og dwMaximumSizeLow
. De er imidlertid ikke den høyeste og lavest mulige størrelsen på dataene, slik du forventer. De er den høye og den laveste delen av den samme, hver av dem er en 32-biters del av 64-biters størrelse:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Så hvis du setter 256 i begge disse verdiene vil det delte minnet være 256 * 4294967295 + 256 = 1099 511 627 776 byte! At «vil være 1099 GB. Er du sikker på at du har kapasitet til det?
Hvorfor krasjer det ikke hvis størrelsen på det delte minnet er for liten?
Når du reduserer størrelsen til 1 og skriver flere byte til det delte minnet, kan du ødelegge minnet. Det kan forbli ubemerket.
Det krasjer ikke, absolutt fordi segfeilene oppdages via personsøkersystemet, og en vanlig side på windows er 4Kb. Eksempelmeldingen din er for liten til at personsøkersystemet merker at den forespurte adressen går utenfor grensene.
Kommentarer
- Microsoft-dokumentasjonen er ikke klar for meg mens dette svaret rydder hva høyordens og lavordens er.
Legg igjen en kommentar