CreateFileMapping () – parametre af størrelse
On februar 10, 2021 by adminJeg vil lave et program, der sætter nogle sætninger i delt hukommelse, så et andet program modtager denne massage. Jeg lavede det, men jeg forstår ikke de 4. og 5. parametre i CreateFileMapping ().
I mit program skriver jeg 256 (5. parameter), men da jeg ændrede dette til 1, fungerede programmet stadig. Jeg troede, det skulle gå ned, fordi jeg antager, at dwMaximumSizeLow er den laveste størrelse. Når jeg lægger en vis værdi i 4. argument, går programmet ned. Jeg troede, at denne værdi skulle være højere end den 5., men jeg tog fejl.
Min kode:
#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 4. og 5. parametre for CreateFileMapping () fungerer?
Kommentarer
- Beder du os om at finde Microsoft ' s dokumentation for denne funktion for dig? (dette er let at Google) Eller en forklaring på, hvad visse dele af dokumentationen betyder? (kunne du medtage anførselstegn af de nøjagtige dele, du ikke kunne ' ikke forstå? Jeg kunne gætte, men jeg ' gætter sandsynligvis forkert) Jeg forstår heller ikke ' hvordan dette kodestykke er relevant for dit spørgsmål, hvis du ' kun spørger om, hvordan en enkelt funktion fungerer.
- Jeg spørger om 4. og 5. parameter for CreateFileMapping (), fordi jeg ikke ' ikke forstår, hvordan det fungerer. Fra dokumentation troede jeg, at dwMaximumSizeHigh er den højeste størrelse af data i delt hukommelse, og dwMaximumSizeLow er den laveste størrelse af data. Så jeg ville kontrollere, hvordan det fungerer, og jeg ændrede værdi i 5. parametre på 1 program, der stadig fungerede. Og jeg ved ikke ' hvorfor, for så er det programmet med den laveste størrelse, der skal gå ned.
Svar
-dokumentationen forklarer meget godt de 4. og 5. parametre, dwMaximumSizeHigh
og dwMaximumSizeLow
. De er dog ikke den højeste og den lavest mulige størrelse af dataene, som du forventer. De er den højeste og den laveste del af den samme, hver af dem er en 32 bit del af 64 bit størrelse:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Så hvis du sætter 256 i begge disse værdier vil din delte hukommelse være 256 * 4294967295 + 256 = 1099 511 627 776 byte! At “vil være 1099 GB. Er du sikker på, at du har kapacitet til det?
Hvorfor kolliderer det ikke, hvis størrelsen på den delte hukommelse er for lille?
Når du reducerer størrelsen til 1 og skriver flere byte til den delte hukommelse, kan du muligvis ødelægge hukommelsen. Det forbliver måske ubemærket.
Det går ikke ned, bestemt fordi segfejlene registreres via personsøgningssystemet, og en typisk side på windows er 4Kb. Din eksempelbesked er for lille til, at personsøgningssystemet bemærker, at den anmodede adresse går uden for grænserne.
Kommentarer
- Microsoft-dokumentationen er ikke klar for mig, mens dette svar rydder, hvad høj orden og lav orden er.
Skriv et svar