VC修改EXE文件图标的编程实现
作者:admin 文章来源:转载 点击数:553 更新时间:2009-8-10
这个问题以前在CSDN上解答过,但是当时只是提了提几个要用到的函数,自己并没有去动手写实现。前几天和某人讨论这个问题,他认为只有通过PE内部的资源偏移才好改,熊猫烧香就是这么搞的,而我坚持API也可以的观点。后来我想了想觉得这个问题值得记住,并自己亲手把它写出来并试验成功。贴出代码来给大家分享
EnableDebugPrivilge(SE_DEBUG_NAME,TRUE);
HGLOBAL hResLoad(NULL);
HANDLE hExe(NULL);
HRSRC hRes(NULL);
HANDLE hUpdateRes(NULL);
char * lpResLock;
BOOL result;
hExe = LoadLibrary(_TEXT("D:\\Src.exe"));
if (hExe == NULL)
{
AfxMessageBox("加载Src.exe失败.",0,0);
}
hRes = FindResource((HMODULE)hExe, (LPCSTR)1, RT_ICON);
if (hRes == NULL)
{
AfxMessageBox("不能定位Src.exe中的第一个图标");
}
hResLoad = LoadResource((HMODULE)hExe, hRes);
if (hResLoad == NULL)
{
AfxMessageBox("不能加载该图标资源");
}
lpResLock =(char *)LockResource(hResLoad);
if (lpResLock == NULL)
{
AfxMessageBox("不能锁定该资源.");
}
hUpdateRes = BeginUpdateResource("G:\\Target.exe", FALSE);
if (hUpdateRes == NULL)
{
AfxMessageBox("不能打开Target.exe准备写.");
}
result =UpdateResource((HMODULE)hUpdateRes , RT_ICON,
(LPCSTR)1, 0, lpResLock, SizeofResource((HMODULE)hExe, hRes));
if (result == FALSE)
{
AfxMessageBox("添加资源失败.");
}
if (!EndUpdateResource(hUpdateRes, FALSE))
{
AfxMessageBox("不能向目标EXE中写入改动结束资源更新");
}
if (!FreeLibrary((HMODULE)hExe))
{
AfxMessageBox("不能释放Src的句柄.");
}
有人说编程靠思路和套路,这个套路可真是够长的,这么多的函数必须按顺序配套使用,不能有差错。其实按照讨论的VC编程还有很多啊,比如CreateFile、CreateFileMapping、MapViewOfFile、UnmapViewOfFile这也是一个典型套路。