找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 10578|回复: 12

问一个看似简单的问题:res导入exe

 火... [复制链接]

4

主题

28

回帖

0

精华

铜牌会员

积分
199
QQ
发表于 2010-1-23 15:34:31 | 显示全部楼层 |阅读模式
现在用链接器根本弄不了有资源的文件,对着可执行文件一筹莫展。
ResHacker貌似只能替换资源,网上的什么更改Exe图标根本改不了图标,只能把有图标的变没……
现在请问大家,有没有什么好方法?
貌似有BeginUpdateResource、UpdateResource和EndUpdateResource可以用,MSDN又查不到什么……
上帝一样掷骰子!

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-23 19:36:19 | 显示全部楼层
以前新林好像帮我找到一个,你搜索一下我在VBGOOD的求助帖。
如果附件无法下载,请点击这里

4

主题

28

回帖

0

精华

铜牌会员

积分
199
QQ
 楼主| 发表于 2010-1-24 07:46:15 | 显示全部楼层
回复 2# HoviDelphic


    汗,我上不了VBGood,能帮我找找吗?谢谢了
上帝一样掷骰子!

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-24 22:54:25 | 显示全部楼层
vbgood可以上了
如果附件无法下载,请点击这里

4

主题

28

回帖

0

精华

铜牌会员

积分
199
QQ
 楼主| 发表于 2010-1-25 18:05:50 | 显示全部楼层
回复 4# HoviDelphic


    我依旧不行,悲剧了
上帝一样掷骰子!

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-25 21:15:10 | 显示全部楼层
现在能上也没用,附件全部丢失了。
如果附件无法下载,请点击这里

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-1-26 16:17:24 | 显示全部楼层
回复 6# HoviDelphic


    附件丢失 悲剧啊!!!!!

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-1-27 11:10:21 | 显示全部楼层
http://hi.baidu.com/cxwr/blog/item/9d7f53387efe5af1b211c780.html

菜新写过一个例子,参考一下吧.
我就是嗷嗷叫的老马了......

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-1-29 09:19:02 | 显示全部楼层
这个问题应该是PE文件结构的问题了。。。。研究哈PE文件结构。。。。。那样你甚至可以手动构造一个PE文件出来,添加资源当然就没问题了

4

主题

28

回帖

0

精华

铜牌会员

积分
199
QQ
 楼主| 发表于 2010-2-1 09:36:13 | 显示全部楼层
回复 8# 马大哈


    谢谢了,不过我已经看过了,没什么大用处
上帝一样掷骰子!

7

主题

36

回帖

2

精华

初来乍到

积分
3171
发表于 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 函数第三个参数。

评分

参与人数 1 +20 +20 水晶币 +20 +20 收起 理由
Tesla.Angela + 20 + 20 + 20 + 20 我很赞同

查看全部评分

4

主题

28

回帖

0

精华

铜牌会员

积分
199
QQ
 楼主| 发表于 2011-2-22 18:08:03 | 显示全部楼层
回复 lxl1638 的帖子

感谢~!!!
上帝一样掷骰子!
头像被屏蔽

0

主题

21

回帖

0

精华

银牌会员

积分
1430
发表于 2011-3-6 13:42:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表