TengAttack 发表于 2010-1-23 15:34:31

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

现在用链接器根本弄不了有资源的文件,对着可执行文件一筹莫展。
ResHacker貌似只能替换资源,网上的什么更改Exe图标根本改不了图标,只能把有图标的变没……
现在请问大家,有没有什么好方法?
貌似有BeginUpdateResource、UpdateResource和EndUpdateResource可以用,MSDN又查不到什么……

HoviDelphic 发表于 2010-1-23 19:36:19

以前新林好像帮我找到一个,你搜索一下我在VBGOOD的求助帖。

TengAttack 发表于 2010-1-24 07:46:15

回复 2# HoviDelphic


    汗,我上不了VBGood,能帮我找找吗?谢谢了

HoviDelphic 发表于 2010-1-24 22:54:25

vbgood可以上了

TengAttack 发表于 2010-1-25 18:05:50

回复 4# HoviDelphic


    我依旧不行,悲剧了

HoviDelphic 发表于 2010-1-25 21:15:10

现在能上也没用,附件全部丢失了。

oopww 发表于 2010-1-26 16:17:24

回复 6# HoviDelphic


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

马大哈 发表于 2010-1-27 11:10:21

http://hi.baidu.com/cxwr/blog/item/9d7f53387efe5af1b211c780.html

菜新写过一个例子,参考一下吧.

364589886 发表于 2010-1-29 09:19:02

这个问题应该是PE文件结构的问题了。。。。研究哈PE文件结构。。。。。那样你甚至可以手动构造一个PE文件出来,添加资源当然就没问题了

TengAttack 发表于 2010-2-1 09:36:13

回复 8# 马大哈


    谢谢了,不过我已经看过了,没什么大用处

lxl1638 发表于 2011-2-2 00:37:41

本帖最后由 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 函数第三个参数。

TengAttack 发表于 2011-2-22 18:08:03

回复 lxl1638 的帖子

感谢~!!!{:1_127:}

wxy_332 发表于 2011-3-6 13:42:49

页: [1]
查看完整版本: 问一个看似简单的问题:res导入exe