1 // 释放【BMP文件】到指定的文件夹 2 BOOL ReleaseBMPRes(LPCTSTR szDLLFullPath, UINT uResID, LPCTSTR szResType) 3 { 4 if (uResID<=0 || !szResType) 5 { 6 return FALSE; 7 } 8 9 HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(uResID), szResType); 10 if ( NULL == hRsrc ) 11 { 12 return FALSE; 13 } 14 15 DWORD dwSize = SizeofResource(NULL, hRsrc); 16 if ( dwSize <= 0) 17 { 18 return FALSE; 19 } 20 21 HGLOBAL hGlobal = LoadResource(NULL, hRsrc); 22 if ( NULL == hGlobal ) 23 { 24 return FALSE; 25 } 26 27 LPVOID pBuffer = LockResource(hGlobal); 28 if ( NULL ==pBuffer ) 29 { 30 return FALSE; 31 } 32 33 DWORD dwWritten = 0; 34 HANDLE hFile = CreateFile(szDLLFullPath, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 35 if (INVALID_HANDLE_VALUE == hFile ) 36 { 37 return FALSE; 38 } 39 if (szResType = RT_BITMAP) 40 { 41 // 获得位图信息头 42 BITMAPINFOHEADER bmpInfoHeader; 43 CopyMemory(&bmpInfoHeader, pBuffer, sizeof(BITMAPINFOHEADER)); 44 45 //获得位图颜色表中的RGBQUAD结构个数 46 long nColorEntries; 47 switch(bmpInfoHeader.biBitCount) 48 { 49 case 1: 50 nColorEntries = 2; 51 break; 52 case 4: 53 nColorEntries = 16; 54 break; 55 case 8: 56 nColorEntries = 256; 57 break; 58 default: 59 nColorEntries = 0; 60 break; 61 } 62 63 // 根据位图信息头创建位图文件头 64 BITMAPFILEHEADER bmpFileHeader; 65 bmpFileHeader.bfType = 0x4d42; // "BM" 66 bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + dwSize; 67 bmpFileHeader.bfReserved1 = bmpFileHeader.bfReserved2 = 0; 68 bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD); 69 70 // 写入位图文件头 71 WriteFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); 72 } 73 74 75 if (FALSE == WriteFile(hFile, pBuffer, dwSize, &dwWritten, NULL)) 76 { 77 AfxMessageBox(_T("写入失败!")); 78 return FALSE; 79 } 80 81 CloseHandle(hFile); 82 UnlockResource(hGlobal); 83 FreeResource(hGlobal); 84 return TRUE; 85 }