|
发表于 2011-2-2 00:37:41
|
显示全部楼层
本帖最后由 lxl1638 于 2011-2-2 00:54 编辑
TengAttack 发表于 2010-1-23 15:34 
现在用链接器根本弄不了有资源的文件,对着可执行文件一筹莫展。
ResHacker貌似只能替换资源,网上的什么更 ...
//////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct _RESOURCE_DATE
{
HANDLE hUpdate;
WORD uLangeID;
BOOL bAllResouce;
}RESOURCE_DATE,*PRESOURCE_DATE;
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
WORD GetModuleLangeID(PTSTR ModuleName)
{
WORD uLangeID = MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US);
DWORD dwTemp = 0;
if (DWORD dwInfoSize = GetFileVersionInfoSize(ModuleName,&dwTemp))
{
if (PBYTE VerBuf = (PBYTE)UMemInit(sizeof(BYTE)* dwInfoSize))
{
if (GetFileVersionInfo(ModuleName,NULL,dwInfoSize,VerBuf))
{
UINT uLen = sizeof(DWORD);
VerQueryValue(VerBuf,TEXT("\\VarFileInfo\\Translation"),(LPVOID *)&dwTemp,&uLen);
PWORD p = (PWORD)((NTDWORD)dwTemp);
uLangeID = *p;
}
_SafeFree(VerBuf);
}
}
return uLangeID;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK DeleteExistingResource(HMODULE hModule,PTSTR lpszType,PTSTR lpszName,PRESOURCE_DATE PResourceDate)
{
return UpdateResource(PResourceDate->hUpdate,lpszType,lpszName,PResourceDate->uLangeID,NULL,0);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK UpdateNewResource(HMODULE hModule,PTSTR lpszType,PTSTR lpszName,PRESOURCE_DATE PResourceDate)
{
BOOL bResult = FALSE;
if (HRSRC hRes = FindResource(hModule,lpszName,lpszType))
{
if (HGLOBAL hResLoaded = LoadResource(hModule,hRes))
{
if (PVOID pData = LockResource(hResLoaded))
{
if (DWORD nSizeOfIconRes = SizeofResource(hModule,hRes))
{
bResult = UpdateResource(PResourceDate->hUpdate,
lpszType,
lpszName,
PResourceDate->uLangeID,pData,
nSizeOfIconRes);
}
UnlockResource(hResLoaded);
}
FreeResource(hResLoaded);
}
}
return (PResourceDate->bAllResouce && bResult);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CopyResourceData(PTSTR ptzSrcFile,PTSTR ptzDesFile,PTSTR ptzResourceType,CONST BOOL bAllResouce = TRUE)
{
BOOL bResult = FALSE;
ResourceDate.uLangeID = GetModuleLangeID(ptzSrcFile);
if (HANDLE hUpdate = BeginUpdateResource(ptzDesFile,FALSE))
{
ResourceDate.hUpdate = hUpdate;
if (HMODULE hDes = LoadLibraryEx(ptzDesFile,NULL,LOAD_LIBRARY_AS_DATAFILE))
{
EnumResourceNames(hDes,ptzResourceType,(ENUMRESNAMEPROCW)DeleteExistingResource,(LONG_PTR)&ResourceDate);
FreeLibrary(hDes);
if (HMODULE hSrc = LoadLibraryEx(ptzSrcFile,NULL,LOAD_LIBRARY_AS_DATAFILE))
{
ResourceDate.bAllResouce = bAllResouce;
EnumResourceNames(hSrc,ptzResourceType,(ENUMRESNAMEPROCW)UpdateNewResource,(LONG_PTR)&ResourceDate);
FreeLibrary(hSrc);
bResult = TRUE;
}
}
bResult = (EndUpdateResource(hUpdate,FALSE) && bResult);
}
return bResult;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CopyResourceIcon(PTSTR ptzSrcFile,PTSTR ptzDesFile,CONST BOOL bAllResouce = FALSE)
{
return (CopyResourceData(ptzSrcFile,ptzDesFile,RT_ICON,bAllResouce)
&& CopyResourceData(ptzSrcFile,ptzDesFile,RT_GROUP_ICON,bAllResouce));
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CopyVersionInfo(PTSTR ptzSrcFile,PTSTR ptzDesFile)
{
return CopyResourceData(ptzSrcFile,ptzDesFile,RT_VERSION,TRUE);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CopyManifest(PTSTR ptzSrcFile,PTSTR ptzDesFile)
{
return CopyResourceData(ptzSrcFile,ptzDesFile,RT_MANIFEST,TRUE);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//应用示例
//用 TEST1.EXE 的图标复制给/替换 TEST2.EXE
CopyResourceIcon(TEXT("H:\\TEST1.EXE"),TEXT("H:\\TEST2.EXE"));
CopyManifest(TEXT("H:\\TEST1.EXE"),TEXT("H:\\TEST2.EXE"));
CopyVersionInfo(TEXT("H:\\TEST1.EXE"),TEXT("H:\\TEST2.EXE"));
要复制或构建其它资源,可修改 CopyResourceData 函数第三个参数。
|
评分
-
查看全部评分
|