fájl memória leképezés WinAPI, valamint a szóban forgó - a vizsgálati ismeretek csillaggal, jegyzetek
A fájlok a memóriában szoktuk OpenGL cikkek a munkát a modellek és textúrák. de nem vizsgálja részletesen, hogyan is működik ez. És bár biztos vagyok benne, hogy sok olvasó a blog már ismeri a fájlokat a kijelző memóriába, még mindig úgy érezte, hogy meg kell írni a megfelelő megjegyzések azoknak az olvasóknak, akik nem ismerik a mechanizmust. Ma megnézzük hogyan működik Windows alatt.
Vezetője egy szerkezet tárolására fájlkezelő, a kilincset a kijelző, a fájl mérete, és egy mutatót a memória helyen a térképen:
struct FileMapping # 123;
FOGANTYÚ hFile;
FOGANTYÚ hMapping;
size_t fsize;
unsigned char * dataPtr;
# 125; ;
Tekintsük olvasni a fájlt a feltérképezése.
FOGANTYÚ hFile = CreateFile # 40; fname, GENERIC_READ, 0. nullptr, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, nullptr # 41; ;
ha # 40; hFile == INVALID_HANDLE_VALUE # 41; # 123;
std. cerr <<"fileMappingCreate - CreateFile failed, fname = "
<
# 125;
A CreateFile eljárás vagyunk már ismeri a következő megjegyzés: megtanulják, hogyan kell dolgozni a fájlokat a Windows API-t. így menjünk tovább.
Get fájlméret:
DWORD dwFileSize = GetFileSize # 40; hFile, nullptr # 41; ;
ha # 40; dwFileSize == INVALID_FILE_SIZE # 41; # 123;
std. cerr <<"fileMappingCreate - GetFileSize failed, fname = "
<
visszatérés nullptr;
# 125;
A második érv GetFileSize eljárás kap egy mutatót duplaszóbejegyzésében a régebbi része a fájl méretét. Vezetjük az érvvel nullptr, már csak korlátozott a méret a fájl, ami lehet visszaküldeni. Ha a fájl mérete 4 GB vagy több, az eljárás visszatér egy hiba.
FOGANTYÚ hMapping = CreateFileMapping # 40; hFile, nullptr, PAGE_READONLY, 0. 0,
nullptr # 41; ;
ha # 40; hMapping == nullptr # 41; # 123;
std. cerr <<"fileMappingCreate - CreateFileMapping failed, fname = "
<
visszatérés nullptr;
# 125;
Megjegyezzük, hogy hMapping ellenőrizni egyenlőség nullptr. Ez nem hiba - szerint az MSDN, abban az esetben a hiba CreateFileMapping tényleg vissza null pointer helyett INVALID_HANDLE_VALUE, mint bárki is gondolná. Az ilyen ellentmondás, sajnos, előfordul időnként a WinAPI. Már találkoztunk ebben a kérdésben, tanulmányozza a munkát a rendszerleíró adatbázist.
Végül kap egy mutatót a memória helyen a térképet MapViewOfFile eljárás:
unsigned char * dataPtr = # 40; unsigned char * # 41; MapViewOfFile # 40; hMapping,
FILE_MAP_READ,
0
0
dwFileSize # 41; ;
ha # 40; dataPtr == nullptr # 41; # 123;
std. cerr <<"fileMappingCreate - MapViewOfFile failed, fname = "
<
CloseHandle # 40; hFile # 41; ;
visszatérés nullptr;
# 125;
Ezután töltse FileMapping szerkezetét, és visszatér a mutatót, mint egy eredmény:
FileMapping * leképezés = # 40; FileMapping * # 41; malloc # 40; sizeof # 40; FileMapping # 41; # 41; ;
ha # 40; térképezés == nullptr # 41; # 123;
std. cerr <<"fileMappingCreate - malloc failed, fname = "
<
CloseHandle # 40; hMapping # 41; ;
CloseHandle # 40; hFile # 41; ;
visszatérés nullptr;
# 125;
térképezés -> hFile = hFile;
térképezés -> hMapping = hMapping;
térképezés -> dataPtr = dataPtr;
mapping -> fsize = # 40; size_t # 41; dwFileSize;
Ha a kijelző felesleges, ne felejtsd el, hogy zárja be:
UnmapViewOfFile # 40; mapping -> dataPtr # 41; ;
CloseHandle # 40; mapping -> hMapping # 41; ;
CloseHandle # 40; mapping -> hFile # 41; ;
ingyenes # 40; térképészet # 41; ;
Mint látható, minden könnyen. Forrásai ezt a cikket itt található.
Mint a bejegyzést? Oszd meg másokkal:
(Meg kell adni JS)