动态添加、删除、更新EXE中的资源

下面贴出添加资源到EXE中的代码片断, 删除和更新都类似。

 

1. 把资源添加到EXE中

#define MY_RES 100 void add_res() { FILE *fp = fopen("1.exe", "rb"); fseek(fp, 0, SEEK_END); DWORD l_file_len = ftell(fp); rewind(fp); char *pBuffer = new char[l_file_len]; long r = fread(pBuffer, 1, l_file_len, fp); assert(r == l_file_len); fclose(fp); HANDLE hUpdate = ::BeginUpdateResource(_T("CustomResource.exe"), FALSE); if (hUpdate == NULL) goto end; BOOL bRet = ::UpdateResource(hUpdate, RT_RCDATA, MAKEINTRESOURCE(MY_RES), MAKELANGID(LANG_NEUTRAL, LANG_NEUTRAL), pBuffer, l_file_len); ::EndUpdateResource(hUpdate, FALSE); end: delete [] pBuffer; } int _tmain(int argc, _TCHAR* argv[]) { add_res(); return 0; }

 

 

2. 在EXE中读出资源

void CCustomResourceDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here HRSRC hRes = ::FindResource(NULL, MAKEINTRESOURCE(MY_RES), RT_RCDATA); if (hRes == NULL) return; DWORD dwSize = SizeofResource(NULL, hRes); if (dwSize == 0) return; HGLOBAL hGlobal = ::LoadResource(NULL, hRes); if (hGlobal == NULL) return; void *pBuffer = ::LockResource(hGlobal); if (pBuffer == NULL) return; ::UnlockResource(hGlobal); ::FreeResource(hRes); FILE *fp = fopen("target.exe", "wb"); if (fp == NULL) return; fwrite(pBuffer, 1, dwSize, fp); fclose(fp); }

你可能感兴趣的:(动态添加、删除、更新EXE中的资源)