CreateFileMapping () –
On február 10, 2021 by adminméretű paraméterek Szeretnék készíteni egy programot, amely egy mondatot a megosztott memóriába tesz, hogy egy másik program megkapja ezt a masszázst. Ezt elkészítettem, de nem értem a CreateFileMapping () 4. és 5. paraméterét.
A programomba írok 256-ot (5. paraméter), de amikor ezt 1-re változtattam, a program akkor is működött. Azt hittem, összeomlik, mert feltételezem, hogy a dwMaximumSizeLow a legkisebb méretű. Amikor a 4. argumentumban adok valamilyen értéket, a program összeomlik. Úgy gondoltam, hogy ennek az értéknek magasabbnak kell lennie az 5. helyen, de tévedtem.
A kódom:
#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; }
Meg tudnád magyarázni, hogy a 4. és a CreateFileMapping () munka 5. paramétere?
Megjegyzések
- Arra kér minket, hogy keressük meg a Microsoft ' a funkció dokumentációja az Ön számára? (ezt könnyű a Google számára) Vagy magyarázat arra, hogy mit jelentenek a dokumentáció egyes részei? (tartalmazhatna idézeteket azokról a részekről, amelyeket ' nem tudna megérteni? Találnám, de ' valószínűleg rosszul tippeltem ne is értsd ' és ne értsd, hogy ez a kódrészlet miért releváns a kérdésed szempontjából, ha ' csak egyetlen funkció működéséről kérdezel.
- A CreateFileMapping () 4. és 5. paraméteréről kérdezem, mert nem értem ', hogy működik. A dokumentációból azt gondoltam, hogy a dwMaximumSizeHigh a legnagyobb méretű adat a megosztott memóriában, a dwMaximumSizeLow pedig a legkisebb adatméret. Szóval szerettem volna ellenőrizni a működését, és megváltoztattam az értéket az 5. program paraméterein, még mindig 1 programon. És nem tudom, hogy ' miért, mert így a legkisebb méretű programnak össze kell esnie.
Válasz
A dokumentáció nagyon jól megmagyarázza a 4. és 5. paramétert, dwMaximumSizeHigh
és dwMaximumSizeLow
. Ezek azonban nem az adatok lehető legmagasabb és legkisebb méretűek, ahogyan azt te is kitalálod. Ezek a magas rendű és az alacsony rendű részek, mindegyik a 64 bites méret 32 bites része:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Tehát ha 256 mindkét értéknél megosztott memóriája 256 * 4294967295 + 256 = 1 099 511 627 776 bájt lesz! Ez “1099 GB lesz. Biztos benne, hogy rendelkezik ezzel a kapacitással?
Miért nem összeomlik, ha a megosztott memória mérete túl kicsi?
Ha 1-re csökkenti a méretet, és további bájtokat ír a megosztott memóriába, akkor a memória sérülhet. Lehet, hogy észrevétlen marad.
Ez nem fog összeomlani, minden bizonnyal azért, mert a szegmentumokat a személyhívó rendszeren keresztül észleli, és egy tipikus oldal a Windows-on 4Kb. A példaüzenete túl kicsi ahhoz, hogy a személyhívó rendszer észrevegye, hogy a kért cím megy határon kívül.
Megjegyzések
- A Microsoft dokumentációja nem világos számomra, míg ez a válasz kitisztítja, hogy mi a magas rendű és az alacsony rendű. / li>
Vélemény, hozzászólás?