char crc[MAX_PATH] = {0};
bool CalcResourceCrc(WORD ResourceID)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HINSTANCE hInst = AfxGetResourceHandle();
hRes = FindResource(hInst, MAKEINTRESOURCE(ResourceID), RT_GROUP_ICON);
//int iTest = SizeofResource(hInst, hRes);
int err = ::GetLastError();
if (!hRes) return false;
HRSRC hMem = (HRSRC)LoadResource(hInst, hRes);
HRSRC lpResource = (HRSRC)LockResource(hMem);
//BYTE bTest[30] = {0};
//memcpy(bb, lpResource, iTest); 这一段是ICON的开头信息,有点紊乱,以后研究.
int nID = LookupIconIdFromDirectoryEx((PBYTE)lpResource, TRUE,
0, 0, LR_DEFAULTCOLOR);
HRSRC hResource = FindResource(hInst,
MAKEINTRESOURCE(nID),
MAKEINTRESOURCE(RT_ICON));
hMem = (HRSRC)LoadResource(hInst, hResource);
lpResource = (HRSRC)LockResource(hMem);
int len = SizeofResource(hInst, hResource);
BYTE b = new BYTE[len + 1];
b[len] = 0;
memcpy(b, lpResource, len);
_snprintf(crc, MAX_PATH, "%08X", CRC::CRC_32(b, len));
CFile inout;
if(inout.Open(_T("icon.bin"), CFile::modeWrite | CFile::modeCreate))
{
inout.Write(b, len);
inout.Close();
}
delete[] b;
return true;
}
经测试,输出来的文件ICON.BIN和 原来在资源中的文件的二进制值完全匹配。这个方法也可以推广到bitmap, image, jpg上,此处省略一万字。
对于RT_GROUP_ICON 找到的ICON文件头信息,有点不一样,不明觉厉,以后再追究。
参考:http://blog.csdn.net/kvw3000/article/details/69805
以下是实验的对比图