UpdateResource(增加、删除或替代某可执行文件中的资源)

功能:该函数增加、删除或替代某可执行文件中的资源

函数原型:[code]UpdateResource  hUpdate, lpType, lpName, wLanguage, lpData, cbData[/code]参数详解:[code]hUpdate   -> 由BeginUpdateResource函数创建的更新资源的句柄
lpType    -> 指向说明将被更新的资源类型的字符串,它以NULL为终止符。类型详见备注
lpName    -> 指向说明待被更新的资源名称的字符串,它以NULL为终止符。
wLanguage -> 指定将被更新资源的语言标识。
lpData    -> 指向被插入可执行文件的资源数据的指针。如果资源是预定义类型值之一,那么数据必须是有效且适当排列的。注意这是存储在可执行文件中原始的二进制数据,而不是由Loadlcon,LoadString或其他装载特殊资源函数提供的数据。所有包含字符串、文本的数据必须是Unicode格式;IpData不能指向ANSI数据。
如果为NULL,所指定的资源将从可执行文件中被删除。
cbData    -> 指定lpData中的资源数据数据大小,以字节计数[/code]返回值:[code]成功,返回非零;失败,返回零。若想获得更多的错误信息,请调用GetLastError函数。[/code]*************************************
备注:
1.所在库:kernel32
2.应用程序重复使用UpdateResource去改变资源数据。每次UpdateResource调用都要占用系统内部的一个增加、删除、替代的列表,而实际上并没有将数据写到可执行文件中。应用程序必须通过使用EndUpdateResource函数将每次积累的变化写入可执行文件中。
3.类型对应表:[code]RT_ACCELERATOR -> 加速器表
RT_ANICURSOR   -> 动态光标
RT_ANIICON     -> 动态图标
RT_BITMAP      -> 位图资源
RT_CURSOR      -> 由硬件支持的光标资源
DI_DIALOG      -> 对话框
RT_FONT        -> 字体资源
RT_FONTDIR     -> 字体目录资源
RT_GROUP_CURSOR -> 与硬件无关的光标资源
RT_GROUP_ICON  -> 与硬件无关的目标资源
RT_HTML        -> HTML文档
RT_ICON        -> 由硬件支持的图标资源
RT_MENU        -> 菜单资源
RT_MESSAGETABLE -> 消息表的入口
RT_PLUGPLAY    -> 即插即用资源
RT_RCDATA      -> 应用程序定义资源(原始数据或自定义资源)
RT_STRING      -> 字符表入口
RT_VERSION     -> 版本资源
RT_VXD         -> VXD[/code] 

BOOL ReplaceICO(LPCTSTR lpszApp, LPCTSTR lpszICO) { HANDLE hICO; //打开硬盘上的图标文件 if (!(hICO = ::CreateFile(lpszICO, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))) { return FALSE; } LONG lOffset; //资源在文件中的偏移量 DWORD dwSize; //加载后资源的大小 DWORD dwReadByte; //读取文件时实际读取大小,API强制要求。其实没用…… LPVOID lpRes; //指向更新RT_ICON的资源 LPVOID lpGIco; //指向更新RT_GROUP_ICON的资源 CONST BYTE byGSize = 0x18; //RT_GROUP_ICON资源的大小,为常数。 //分配RT_GROUP_ICON资源的内存。 if (!(lpGIco = new BYTE[byGSize])) {::CloseHandle(hICO); return FALSE;} memset(lpGIco, 0, byGSize);//清零RT_GROUP_ICON资源内存 ::ReadFile(hICO, lpGIco, 0x06, &dwReadByte, NULL);//从文件中读取RT_GROUP_ICON资源头 ::ReadFile(hICO, (LPVOID)((BYTE*)lpGIco + 0x08), 0x0C, &dwReadByte, NULL);//从文件中读取RT_GROUP_ICON资源 //获取ICO资源的大小。 memcpy((void*)&dwSize, (void*)((BYTE*)lpGIco + 0x10), sizeof(DWORD)); //获取ICO资源的偏移量。 ::ReadFile(hICO, (void*)&lOffset, sizeof(LONG), &dwReadByte, NULL); //分配ICO资源的内存。 if (!(lpRes = new BYTE[dwSize])) {delete[] lpGIco; ::CloseHandle(hICO); return FALSE;} //偏移文件指针 ::SetFilePointer(hICO, lOffset, NULL, FILE_BEGIN); //读取图标资源到内存。 ::ReadFile(hICO, lpRes, dwSize, &dwReadByte, NULL); ::CloseHandle(hICO); //打开要更改图标的可执行文件。 HANDLE hApp; if (NULL == (hApp = ::BeginUpdateResource(lpszApp, NULL))) { delete[] lpGIco; delete[] lpRes; return FALSE; } //标记更新资源 ::UpdateResource(hApp, RT_GROUP_ICON, MAKEINTRESOURCE(1), 0, lpGIco, byGSize); ::UpdateResource(hApp, RT_ICON, MAKEINTRESOURCE(1), 0, lpRes, dwSize); //写入新资源 int error=0; if (!::EndUpdateResource(hApp, FALSE)) { delete[] lpGIco; delete[] lpRes; error=GetLastError(); return FALSE; } delete[] lpGIco; delete[] lpRes; return TRUE; }  

 

你可能感兴趣的:(html,File,null,delete,dialog,byte)