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 = "
< visszatérés nullptr;
# 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 = "
< CloseHandle # 40; hFile # 41; ;
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 = "
< CloseHandle # 40; hFile # 41; ;
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; hMapping # 41; ;
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 = "
< UnmapViewOfFile # 40; dataPtr # 41; ;
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)

Kapcsolódó cikkek