网站空间商推荐,济南 营销型网站,WordPress手机缩略图过大,腾讯云 安装 wordpress参考 #xff1a;http://user.qzone.qq.com/382164370/infocenter#!app2viaQZ.HashRefreshpos1363445766 内存映射文件可以用于3个不同的目的 • 系统使用内存映射文件#xff0c;以便加载和执行. exe和DLL文件。这可以大大节省页文件空间和应用程序启动运行所需…参考 http://user.qzone.qq.com/382164370/infocenter#!app2viaQZ.HashRefreshpos1363445766 内存映射文件可以用于3个不同的目的 • 系统使用内存映射文件以便加载和执行. exe和DLL文件。这可以大大节省页文件空间和应用程序启动运行所需的时间。
• 可以使用内存映射文件来访问磁盘上的数据文件。这使你可以不必对文件执行I/O操作并且可以不必对文件内容进行缓存。
• 可以使用内存映射文件使同一台计算机上运行的多个进程能够相互之间共享数据。Windows确实提供了其他一些方法以便在进程之间进行数据通信但是这些方法都是使用内存映射文件来实现的这使得内存映射文件成为单个计算机上的多个进程互相进行通信的最有效的方法。
使用内存映射数据文件
若要使用内存映射文件必须执行下列操作步骤
1) 创建或打开一个文件内核对象该对象用于标识磁盘上你想用作内存映射文件的文件。
2) 创建一个文件映射内核对象告诉系统该文件的大小和你打算如何访问该文件。
3) 让系统将文件映射对象的全部或一部分映射到你的进程地址空间中。
当完成对内存映射文件的使用时必须执行下面这些步骤将它清除
1) 告诉系统从你的进程的地址空间中撤消文件映射内核对象的映像。
2) 关闭文件映射内核对象。
3) 关闭文件内核对象。 文件操作是应用程序最为基本的功能之一Win32 API和MFC均提供有支持文件处理的函数和类常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说以上这些函数可以满足大多数场合的要求但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储再以通常的文件处理方法进行处理显然是行不通的。所以可以使用内存文件映射来处理数据网上也有铺天盖地的文章但是映射大文件的时候又往往会出错需要进行文件分块内存映射这里就是这样的一个例子教你如何把文件分块映射到内存。 //
// 该函数用于读取从CCD摄像头采集来的RAW视频数据当中的某一帧图像,
// RAW视频前596字节为头部信息可以从其中读出视频总的帧数
// 帧格式为1024*576*8
/*
参数pszPath文件名dwFrame: 要读取第几帧默认读取第2帧
*/
BOOL MyFreeImage::LoadXRFrames(TCHAR *pszPath, DWORD dwFrame/* 2*/ )
{// get the frames of X-Ray framesBOOL bLoop TRUE;int i;int width 1024;int height 576;int bitcount 8; //1, 4, 8, 24, 32////Build bitmap headerBITMAPFILEHEADER bitmapFileHeader; BITMAPINFOHEADER bitmapInfoHeader; BYTE rgbquad[4]; // RGBQUADint index 0;DWORD widthbytes ((bitcount*width 31)/32)*4; //每行都是4的倍数 DWORD的倍数 这里是 576-TRACE1(widthbytes%d\n, widthbytes);switch(bitcount) { case 1: index 2; bitmapFileHeader.bfOffBits (DWORD)(sizeof(BITMAPFILEHEADER) sizeof(BITMAPINFOHEADER) 2*4); break; case 4: index 16; bitmapFileHeader.bfOffBits (DWORD)(sizeof(BITMAPFILEHEADER) sizeof(BITMAPINFOHEADER) 16*4); break; case 8: index 256; bitmapFileHeader.bfOffBits (DWORD)(sizeof(BITMAPFILEHEADER) sizeof(BITMAPINFOHEADER) 256*sizeof(RGBQUAD)); break; case 24: case 32: index 0; bitmapFileHeader.bfOffBits (DWORD)(sizeof(BITMAPFILEHEADER) sizeof(BITMAPINFOHEADER)); break; default:break;} //构造Bitmap文件头BITMAPFILEHEADER bitmapFileHeader.bfType 0x4d42; // 很重要的标志位 BM 标识bitmapFileHeader.bfSize (DWORD)(bitmapFileHeader.bfOffBits height * widthbytes); //bmp文件长度 bitmapFileHeader.bfReserved1 0; bitmapFileHeader.bfReserved2 0; //构造Bitmap文件信息头BITMAPINFOHEADER bitmapInfoHeader.biSize sizeof(BITMAPINFOHEADER); bitmapInfoHeader.biWidth width; bitmapInfoHeader.biHeight height; bitmapInfoHeader.biPlanes 1; bitmapInfoHeader.biBitCount bitcount;bitmapInfoHeader.biCompression BI_RGB; // 未压缩bitmapInfoHeader.biSizeImage height * widthbytes; bitmapInfoHeader.biXPelsPerMeter 3780; bitmapInfoHeader.biYPelsPerMeter 3780; bitmapInfoHeader.biClrUsed 0; bitmapInfoHeader.biClrImportant 0; //创建BMP内存映像,写入位图头部BYTE *pMyBmp new BYTE[bitmapFileHeader.bfSize]; // 我的位图pMyBmpBYTE *curr pMyBmp; // curr指针指示pMyBmp的位置memset(curr, 0, bitmapFileHeader.bfSize); //写入头信息 memcpy(curr, bitmapFileHeader,sizeof(BITMAPFILEHEADER));curr pMyBmp sizeof(BITMAPFILEHEADER); memcpy(curr, bitmapInfoHeader,sizeof(BITMAPINFOHEADER)); curr sizeof(BITMAPINFOHEADER);//构造调色板 , 当像素大于8位时就没有调色板了。if(bitcount 8) {rgbquad[3] 0; //rgbReservedfor(i 0; i index; i) { rgbquad[0] rgbquad[1] rgbquad[2] i; memcpy(curr, rgbquad, sizeof(RGBQUAD)); curr sizeof(RGBQUAD); } }else if(bitcount 1) { rgbquad[3] 0; //rgbReservedfor(i 0; i index; i) { rgbquad[0] rgbquad[1] rgbquad[2] (256 - i)%256; memcpy(curr, rgbquad, sizeof(RGBQUAD)); curr sizeof(RGBQUAD); } } //// 文件映射,从文件中查找图像的数据//Open the real file on the file systemHANDLE hFile CreateFile(pszPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile INVALID_HANDLE_VALUE){DWORD dwError GetLastError();ATLTRACE(_T(MapFile, Failed in call to CreateFile, Error:%d\n), dwError);SetLastError(dwError);bLoop FALSE;return FALSE;}//Create the file mapping objectHANDLE hMapping CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);if (hMapping NULL){DWORD dwError GetLastError();ATLTRACE(_T(MapFile, Failed in call to CreateFileMapping, Error:%d\n), dwError);// Close handleif (hFile ! INVALID_HANDLE_VALUE){CloseHandle(hFile);hFile INVALID_HANDLE_VALUE;}SetLastError(dwError);bLoop FALSE;return FALSE;}// Retrieve allocation granularitySYSTEM_INFO sinf;GetSystemInfo(sinf);DWORD dwAllocationGranularity sinf.dwAllocationGranularity;// Retrieve file size// Retrieve file sizeDWORD dwFileSizeHigh;__int64 qwFileSize GetFileSize(hFile, dwFileSizeHigh);qwFileSize | (((__int64)dwFileSizeHigh) 32);CloseHandle(hFile);// Read Image__int64 qwFileOffset 0; // 偏移地址DWORD dwBytesInBlock 0, // 映射的块大小dwStandardBlock 100* dwAllocationGranularity ; // 标准块大小DWORD dwFrameSize height*width; // 计算一帧图像的数据量不包括头部信息DWORD dwCurrentFrame 1;dwBytesInBlock dwStandardBlock;if (qwFileSize dwStandardBlock)dwBytesInBlock (DWORD)qwFileSize;//Map the view LPVOID lpData MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, static_castDWORD((qwFileOffset 0xFFFFFFFF00000000) 32), static_castDWORD(qwFileOffset 0xFFFFFFFF), dwBytesInBlock);if (lpData NULL){DWORD dwError GetLastError();ATLTRACE(_T(MapFile, Failed in call to MapViewOfFile, Error:%d\n), dwError);// Close Handleif (hMapping ! NULL){CloseHandle(hMapping);hMapping NULL;}SetLastError(dwError);bLoop FALSE;return FALSE;}BYTE *lpBits (BYTE *)lpData;BYTE *curr1, *curr2, *lpEnd;curr1 lpBits; // seek to startcurr2 lpBits 596; // seek to first framelpEnd lpBits dwBytesInBlock; // seek to end// Read video infomationKMemDataStream streamData( curr1, dwBytesInBlock);ReadXRHeader(streamData);while(bLoop){DWORD dwTmp lpEnd - curr2; //内存缓冲剩余的字节if ( dwTmp dwFrameSize ) {if(dwCurrentFrame dwFrame){memcpy(curr, curr2, dwFrameSize);bLoop FALSE;}curr2 dwFrameSize;}else //内存中不够一帧数据{DWORD dwTmp2 dwFrameSize - dwTmp; // 一副完整的帧还需要dwTmp2字节if (dwCurrentFrame dwFrame){memcpy(curr, curr2, dwTmp);curr dwTmp;}//1、首先计算文件的偏移位置 qwFileOffset dwBytesInBlock;//2、 检查还可以映射多少字节的东东到内存里面if ( qwFileSize - qwFileOffset dwStandardBlock)dwBytesInBlock (DWORD)(qwFileSize - qwFileOffset);//3、重新映射文件UnmapViewOfFile(lpData);lpData MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS,
static_castDWORD((qwFileOffset 0xFFFFFFFF00000000) 32), static_castDWORD(qwFileOffset 0xFFFFFFFF), dwBytesInBlock);if (lpData NULL) // 一定要检查不然可能内存映射失败{DWORD dwError GetLastError();ATLTRACE(_T(MapFile, Failed in call to MapViewOfFile, Error:%d\n),
dwError);SetLastError(dwError);bLoop FALSE;break;}curr2 lpBits (BYTE *)lpData;lpEnd lpBits dwBytesInBlock; // seek to endif (dwCurrentFrame dwFrame){memcpy(curr, curr2, dwTmp2);bLoop FALSE;}curr2 dwTmp2;}dwCurrentFrame;if (dwCurrentFrame
((LPKINFO)m_VideoInfoHeader)-frames ) // 到达文件末尾{bLoop FALSE;}}//将内存流 pMyBmp 转为bitmapKMemDataStream stream(pMyBmp, bitmapFileHeader.bfSize, true);if(!LoadFromMemory(FIF_BMP, stream))return FALSE;//if (lpData ! NULL){//FlushViewOfFile(lpData, 0);UnmapViewOfFile(lpData);lpData
NULL;}//remove the file mappingif (hMapping ! NULL){CloseHandle(hMapping);hMapping NULL;}return TRUE;}