CreateFileMapping () – parametrin koko
On helmikuu 10, 2021 by adminHaluan tehdä ohjelman, joka laittaa lauseen jaettuun muistiin, jotta toinen ohjelma saa tämän hieronnan. Tein sen, mutta en ymmärrä CreateFileMapping (): n 4. ja 5. parametria.
Ohjelmassa kirjoitan 256 (5. parametri), mutta kun vaihdoin tämän arvoon 1, ohjelma toimi edelleen. Luulin, että sen pitäisi kaatua, koska oletan, että dwMaximumSizeLow on pienin koko. Kun laitan jonkin arvon 4. argumenttiin, ohjelma kaatuu. Luulin, että tämän arvon pitäisi olla viides, mutta olin väärässä.
Koodini:
#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; }
Voisitko selittää, kuinka 4. ja CreateFileMapping () -työkalun 5. parametri?
Kommentit
- Pyydätkö meitä etsimään Microsoftin ' onko tämän toiminnon dokumentointi sinulle? (tämä on helppoa Googlelle) Tai selitys siitä, mitä asiakirjan tietyt osat tarkoittavat? (voisitteko sisällyttää lainauksia tarkoista osista, joita et voinut ' ymmärtää? Voisin arvata, mutta arvasin ' todennäköisesti väärin) I älä myöskään ymmärrä ', kuinka tämä koodinpätkä liittyy kysymykseesi, jos ' kysyt vain yhden funktion toiminnasta.
- Kysyn CreateFileMapping (): n 4. ja 5. parametrista, koska en ymmärrä, miten se toimii. Asiakirjoista luulin, että dwMaximumSizeHigh on suurin jaetun muistin tietojen koko ja dwMaximumSizeLow on pienin tietokoko. Joten halusin tarkistaa, miten se toimii, ja muutin arvoa viidennen parametrin kohdalla, joka toimi edelleen. Enkä ' tiedä miksi, koska pienimmän koon ohjelman pitäisi kaatua.
Vastaa
-dokumentaatiossa selitetään hyvin 4. ja 5. parametri, dwMaximumSizeHigh
ja dwMaximumSizeLow
. Ne eivät kuitenkaan ole datan suurin ja pienin mahdollinen koko, kuten ymmärrät. Ne ovat korkeamman ja alemman asteen osia, joista kukin on 32-bittinen osa 64-bittistä:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Joten jos laitat 256 molemmissa näistä arvoista jaettu muistisi on 256 * 4294967295 + 256 = 1099511627776 tavua! Se ”on 1099 Gt. Oletko varma, että sinulla on siihen kapasiteetti?
Miksi se ei kaatu, jos jaetun muistin koko on liian pieni?
Kun pienennät koon 1: ksi ja kirjoitat lisää tavuja jaettuun muistiin, saatat vioittaa muistia. Se voi jäädä huomaamatta.
Se ei kaatu, varsinkin koska segmenttivirheet havaitaan henkilöhakujärjestelmän kautta, ja tyypillinen Windows-sivu on 4 kt. Esimerkki viestisi on liian pieni, jotta hakujärjestelmä huomaa pyydetyn osoitteen menevän rajojen ulkopuolella.
Kommentit
- Microsoftin ohjeet eivät ole minulle selkeitä, kun taas tämä vastaus tyhjentää korkean ja matalan järjestyksen. / li>
Vastaa