1 加载资源
#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);
delete [] pBuffer;
}
2 读资源
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);
}
windows官网
HGLOBAL hResLoad; // handle to loaded resource
HMODULE hExe; // handle to existing .EXE file
HRSRC hRes; // handle/ptr. to res. info. in hExe
HANDLE hUpdateRes; // update resource handle
LPVOID lpResLock; // pointer to resource data
BOOL result;
#define IDD_HAND_ABOUTBOX 103
#define IDD_FOOT_ABOUTBOX 110
// Load the .EXE file that contains the dialog box you want to copy.
hExe = LoadLibrary(TEXT("hand.exe"));
if (hExe == NULL)
{
ErrorHandler(TEXT("Could not load exe."));
return;
}
// Locate the dialog box resource in the .EXE file.
hRes = FindResource(hExe, MAKEINTRESOURCE(IDD_HAND_ABOUTBOX), RT_DIALOG);
if (hRes == NULL)
{
ErrorHandler(TEXT("Could not locate dialog box."));
return;
}
// Load the dialog box into global memory.
hResLoad = LoadResource(hExe, hRes);
if (hResLoad == NULL)
{
ErrorHandler(TEXT("Could not load dialog box."));
return;
}
// Lock the dialog box into global memory.
lpResLock = LockResource(hResLoad);
if (lpResLock == NULL)
{
ErrorHandler(TEXT("Could not lock dialog box."));
return;
}
// Open the file to which you want to add the dialog box resource.
hUpdateRes = BeginUpdateResource(TEXT("foot.exe"), FALSE);
if (hUpdateRes == NULL)
{
ErrorHandler(TEXT("Could not open file for writing."));
return;
}
// Add the dialog box resource to the update list.
result = UpdateResource(hUpdateRes, // update resource handle
RT_DIALOG, // change dialog box resource
MAKEINTRESOURCE(IDD_FOOT_ABOUTBOX), // dialog box id
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), // neutral language
lpResLock, // ptr to resource info
SizeofResource(hExe, hRes)); // size of resource info
if (result == FALSE)
{
ErrorHandler(TEXT("Could not add resource."));
return;
}
// Write changes to FOOT.EXE and then close it.
if (!EndUpdateResource(hUpdateRes, FALSE))
{
ErrorHandler(TEXT("Could not write changes to file."));
return;
}
// Clean up.
if (!FreeLibrary(hExe))
{
ErrorHandler(TEXT("Could not free executable."));
return;
}