问一个看似简单的问题:res导入exe
现在用链接器根本弄不了有资源的文件,对着可执行文件一筹莫展。ResHacker貌似只能替换资源,网上的什么更改Exe图标根本改不了图标,只能把有图标的变没……
现在请问大家,有没有什么好方法?
貌似有BeginUpdateResource、UpdateResource和EndUpdateResource可以用,MSDN又查不到什么…… 以前新林好像帮我找到一个,你搜索一下我在VBGOOD的求助帖。 回复 2# HoviDelphic
汗,我上不了VBGood,能帮我找找吗?谢谢了 vbgood可以上了 回复 4# HoviDelphic
我依旧不行,悲剧了 现在能上也没用,附件全部丢失了。 回复 6# HoviDelphic
附件丢失 悲剧啊!!!!! http://hi.baidu.com/cxwr/blog/item/9d7f53387efe5af1b211c780.html
菜新写过一个例子,参考一下吧. 这个问题应该是PE文件结构的问题了。。。。研究哈PE文件结构。。。。。那样你甚至可以手动构造一个PE文件出来,添加资源当然就没问题了 回复 8# 马大哈
谢谢了,不过我已经看过了,没什么大用处 本帖最后由 lxl1638 于 2011-2-2 00:54 编辑
TengAttack 发表于 2010-1-23 15:34 static/image/common/back.gif
现在用链接器根本弄不了有资源的文件,对着可执行文件一筹莫展。
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 函数第三个参数。
回复 lxl1638 的帖子
感谢~!!!{:1_127:}
页:
[1]