热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VCico替换exe图标不成功

如题替换后用exescope打开看下替换图片部分根本没有图片信息代码如下不知道哪里错误了ICONDIRstID;ICONDIRENTRYstIDE;GRPICONDIR
如题 替换后用exescope打开看下替换图片部分 根本没有图片信息 代码如下 不知道哪里错误了


ICONDIR stID;
ICONDIRENTRY stIDE;
GRPICONDIR stGID;
HANDLE hFile;
DWORD nSize, nGSize, dwReserved;
HANDLE hUpdate;
PBYTE pIcon, pGrpIcon;
BOOL ret;

hFile = CreateFile("D:\\ZN\\ico\\Debug\\zn.ico", GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox("123");
}

ZeroMemory(&stID, sizeof(ICONDIR));
ret = ReadFile(hFile, &stID, sizeof(ICONDIR), &dwReserved, NULL);

ZeroMemory(&stIDE, sizeof(ICONDIRENTRY));
ret = ReadFile(hFile, &stIDE, sizeof(ICONDIRENTRY), &dwReserved, NULL);

nSize = stIDE.dwBytesInRes;
pIcon = (PBYTE)malloc(nSize);
SetFilePointer(hFile, stIDE.dwImageOffset, NULL, FILE_BEGIN);
ret = ReadFile(hFile, (LPVOID)pIcon, nSize, &dwReserved, NULL);



ZeroMemory(&stGID, sizeof(GRPICONDIR));
stGID.idCount = stID.idCount;
stGID.idReserved = 0;
stGID.idType = 1;
CopyMemory(&stGID.idEntries, &stIDE, 12);
stGID.idEntries.nID = 0;

nGSize = sizeof(GRPICONDIR);
pGrpIcon = (PBYTE)malloc(nGSize);
CopyMemory(pGrpIcon, &stGID, nGSize);


hUpdate = BeginUpdateResource("D:\\ZN\\ico\\Debug\\32323.exe", false);
ret = UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(1), NULL, (LPVOID)pGrpIcon, nGSize);
ret = UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(1),NULL, (LPVOID)pIcon, nSize);
EndUpdateResource(hUpdate, false);

CloseHandle(hFile);

14 个解决方案

#1


网上这类的代码挺多 基本都是这个样子 不知道错误在哪里  上面用到的三个结构体我就不列出来了 关于图标的     求大神啊!

#2


自己给自己up  看在帖子在相关内容的百度第一条了 求大神帮忙啊!

#3


代码没看~~ 你是不是要更改工程可执行程序exe的图标? 直接到工程目录下,的res资源文件夹里面把你工程名的ico(例:mytest.ico)换成你想要的图标就好。

如果是要代码执行,是不是程序运行是图标在使用其它什么的。。。。。

#4


引用 3 楼  的回复:
代码没看~~ 你是不是要更改工程可执行程序exe的图标? 直接到工程目录下,的res资源文件夹里面把你工程名的ico(例:mytest.ico)换成你想要的图标就好。

如果是要代码执行,是不是程序运行是图标在使用其它什么的。。。。。


额 是要代码执行的亲, 图标没有在使用啊 我也是借鉴的别人的代码 编译通过了 执行后出现的问题 没有替换成功 找了一下午错误了 实在找不出来~

#5


引用 4 楼  的回复:
引用 3 楼 的回复:
代码没看~~ 你是不是要更改工程可执行程序exe的图标? 直接到工程目录下,的res资源文件夹里面把你工程名的ico(例:mytest.ico)换成你想要的图标就好。

如果是要代码执行,是不是程序运行是图标在使用其它什么的。。。。。


额 是要代码执行的亲, 图标没有在使用啊 我也是借鉴的别人的代码 编译通过了 执行后出现的问题 没有替换成功 找了一下午错误……

哈哈~~~  我帮忙顶帖~~ 

#6


自己UPUP  好好学习天天向上 有解决过这个问题的嘛 帮个忙啊 可以加分的!

#7


你难道是要动态更换exe图标吗?
如果你想要的是我下面的那个效果,可以通过几步完成,我成功更换了
1.找到资源视图中的Icon中的IDR_MAINFRAME
2.删除这个资源
3.添加资源,导入Icon选择自己想要的图标
4.更改ID为IDR_MAINFRAM
5.生成程序发现Debug里的exe图标更改了
我改成百度的图标了,像素有限

#8


就是啊,根本不需要这么麻烦,还写代码。
直接把你要的图片导入资源,然后复制像素进你的IDR_MAINFRAME。这个连原来的资源都不用删除。
再编译出来就是你要的图标了。

#9



SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

要加上上面的代码的,之前遇到过这样的问题...

#10


先查:
hUpdate = BeginUpdateResource("D:\\ZN\\ico\\Debug\\32323.exe", false);
if(hUpdate ==0)
{
DWORD dwErr=GetLastError();
}

#11


“三个结构体”代码上传看看,注意是BYTE对齐的。

#12


给你一个好用的:
http://blog.csdn.net/visualeleven/article/details/5754831
// 第一个参数是将要替换图标的exe文件路径,第二个参数是替换的ico文件路径   
void ReplaceExeIco(LPCTSTR lpszApp, LPCTSTR lpszIco)  
{  
CFile file;  
file.Open(lpszIco, CFile::modeRead);  
LONG lOffset = 0;  
DWORD dwSize = 0;  
DWORD dwBytes = 0;  
CONST BYTE bGroupIcoSize = 0x18;  
BYTE* lpGroupIco = new BYTE[bGroupIcoSize];  
memset(lpGroupIco, 0, bGroupIcoSize);  
file.Read(lpGroupIco, 0x06);  
file.Read(lpGroupIco+0x08, 0x0C);  
memcpy(&dwSize, lpGroupIco+0x10, sizeof(DWORD));  
file.Read(&lOffset, sizeof(lOffset));  
BYTE* lpRes = new BYTE[dwSize];  
memset(lpRes, 0, dwSize);  
file.Seek(lOffset, CFile::begin);  
file.Read(lpRes, dwSize);  

HANDLE hApp = BeginUpdateResource(lpszApp, NULL);  
UpdateResource(hApp, RT_GROUP_ICON, MAKEINTRESOURCE(1), 0, lpGroupIco, bGroupIcoSize);  
UpdateResource(hApp, RT_ICON, MAKEINTRESOURCE(1), 0, lpRes, dwSize);  

EndUpdateResource(hApp, FALSE);  

delete[] lpRes;  
delete[] lpGroupIco;  
file.Close();  
}  

#13


引用 12 楼  的回复:
给你一个好用的:
http://blog.csdn.net/visualeleven/article/details/5754831
// 第一个参数是将要替换图标的exe文件路径,第二个参数是替换的ico文件路径  
void ReplaceExeIco(LPCTSTR lpszApp, LPCTSTR lpszIco)  
{  
CFile file;  
file.Open(l……
额 不是编译时候替换图标啊~不过这个代码还有用些 我找到了个可以实现的代码 贴出来大家共享下把 类似于熊猫烧香 先这样把 结贴了

#14


#include 
#include 

typedef struct tagHEADER      
{      
    WORD idReserved;      
    WORD idType;      
    WORD idCount;      
}HEADER, *LPHEADER;      

typedef struct tagICONDIRENTRY      
{      
    BYTE bWidth;      
    BYTE bHeight;      
    BYTE bColorCount;      
    BYTE bReserved;      
    WORD wPlanes;      
    WORD wBitCount;      
    DWORD dwBytesInRes;      
    DWORD dwImageOffset;      
}ICONDIRENTRY, *LPICONDIRENTRY;      

#pragma pack( push )      
#pragma pack( 2 )      
typedef struct tagGRPICONDIRENTRY      
{      
    BYTE bWidth;      
    BYTE bHeight;      
    BYTE bColorCount;      
    BYTE bReserved;      
    WORD wPlanes;      
    WORD wBitCount;      
    DWORD dwBytesInRes;      
    WORD nID;      
}GRPICONDIRENTRY, *LPGRPICONDIRENTRY;;      

typedef struct tagGRPICONDIR      
{      
    WORD idReserved;      
    WORD idType;      
    WORD idCount;      
    GRPICONDIRENTRY idEntries[1];      
}GRPICONDIR, *LPGRPICONDIR;      
#pragma pack( pop )     
 
 
//.CPP文件中的主要代码:
//view plaincopy to clipboardprint?
void ChangeExeIcon(LPCTSTR lpIconFile, LPCTSTR lpExeName) 
{      
    LPICONDIRENTRY pIconDirEntry(NULL);      
    LPGRPICONDIR pGrpIconDir(NULL);      
    HEADER header;      
    LPBYTE pIconBytes(NULL);      
    HANDLE hIconFile(NULL);      
    DWORD dwRet(0), nSize(0), nGSize(0), dwReserved(0);      
    HANDLE hUpdate(NULL);      
    BOOL ret(FALSE);      
    WORD i(0);      
    
    //打开图标文件      
    hIconFile = CreateFile(lpIconFile, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);      
    if (hIconFile == INVALID_HANDLE_VALUE)      
    {      
        return;      
    }      
    //读取文件头部信息      
    ret=ReadFile(hIconFile, &header, sizeof(HEADER), &dwReserved, NULL);      
    if (!ret)      
    {      
        CloseHandle(hIconFile);      
        return;      
    }      
    //建立每一个图标的目录信息存放区域      
    pIconDirEntry = (LPICONDIRENTRY)new BYTE[header.idCount*sizeof(ICONDIRENTRY)];      
    if (pIcOnDirEntry==NULL)      
    {      
        CloseHandle(hIconFile);      
        return;      
    }      
    //从Icon文件中读取每一个图标的目录信息      
    ret = ReadFile(hIconFile, pIconDirEntry, header.idCount*sizeof(ICONDIRENTRY), &dwReserved, NULL);      
    if (!ret)      
    {      
        delete[] pIconDirEntry;   
        CloseHandle(hIconFile);      
        return;      
    }      
    //建立EXE文件中RT_GROUP_ICON所需的数据结构存放区域      
    nGSize=sizeof(GRPICONDIR)+header.idCount*sizeof(ICONDIRENTRY);      
    pGrpIcOnDir=(LPGRPICONDIR)new BYTE[nGSize];   
    ZeroMemory(pGrpIconDir, nSize);
    //填充信息,这里相当于一个转换的过程      
    pGrpIconDir->idReserved=header.idReserved;      
    pGrpIconDir->idType=header.idType;      
    pGrpIconDir->idCount=header.idCount;      
    //复制信息并设置每一个图标对应的ID。ID为位置索引号      
    for(i=0;i     {      
        pGrpIconDir->idEntries[i].bWidth=pIconDirEntry[i].bWidth;      
        pGrpIconDir->idEntries[i].bHeight=pIconDirEntry[i].bHeight;      
        pGrpIconDir->idEntries[i].bColorCount=pIconDirEntry[i].bColorCount;      
        pGrpIconDir->idEntries[i].bReserved=pIconDirEntry[i].bReserved;      
        pGrpIconDir->idEntries[i].wPlanes=pIconDirEntry[i].wPlanes;      
        pGrpIconDir->idEntries[i].wBitCount=pIconDirEntry[i].wBitCount;      
        pGrpIconDir->idEntries[i].dwBytesInRes=pIconDirEntry[i].dwBytesInRes;      
        pGrpIconDir->idEntries[i].nID=i+1;    //id  == 0 是 RT_GROUP_ICON 的id,我这里替换的时候出现问题,所以就 + 1 了。  
    }      
    //开始更新EXE中的图标资源,ID定为最小0,如果原来存在0ID的图标信息则被替换为新的。      
    hUpdate = BeginUpdateResource(lpExeName, false);      
    if (hUpdate!=NULL)      
    {      
        HMODULE hMe= 0; // means load from this module

        if (FindResource( hMe, lpExeName, RT_GROUP_ICON))
        {
            //首先更新RT_GROUP_ICON信息       
            ret = UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(0), MAKELANGID(LANG_CHINESE, SUBLANG_SYS_DEFAULT), (LPVOID)pGrpIconDir, nGSize);      
            if (!ret)      
            {       
                delete[] pIconDirEntry;
                delete[] pGrpIconDir;  
                CloseHandle(hIconFile);      
                return;      
            }      
        }

        //接着的是每一个Icon的信息存放      
        for(i=0;i         {      
            //Icon的字节数      
            nSize = pIconDirEntry[i].dwBytesInRes;      
            //偏移文件的指针到当前图标的开始处      
            dwRet=SetFilePointer(hIconFile, pIconDirEntry[i].dwImageOffset, NULL, FILE_BEGIN);      
            if (dwRet==INVALID_SET_FILE_POINTER)      
            {      
                break;      
            }      
            //准备pIconBytes来存放文件里的Byte信息用于更新到EXE中。
            
            delete[] pIconBytes;
            
            pIconBytes = new BYTE[nSize];  
            ZeroMemory(pIconBytes, nSize);
            ret = ReadFile(hIconFile, (LPVOID)pIconBytes, nSize, &dwReserved, NULL);      
            if(!ret)      
            {      
                break;      
            }      
            //更新每一个ID对应的RT_ICON信息      
            ret = UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(pGrpIconDir->idEntries[i].nID), MAKELANGID(LANG_CHINESE, SUBLANG_SYS_DEFAULT), (LPVOID)pIconBytes, nSize);      
            if(!ret)      
            {      
                break;      
            } 
        }      
        //结束EXE资源的更新操作      
        if (pIconBytes!=NULL)      
        {      
           delete[] pIconBytes;
        }      

        EndUpdateResource(hUpdate, false);      
    }    
    
    //清理资源并关闭Icon文件,到此更新操作结束!
    SAFE_ARRAY_DELETE(pGrpIconDir); 
    SAFE_ARRAY_DELETE(pIconDirEntry);       
    CloseHandle(hIconFile);      
}     


推荐阅读
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 实现一个通讯录系统,可添加、删除、修改、查找、显示、清空、排序通讯录信息
    本文介绍了如何实现一个通讯录系统,该系统可以实现添加、删除、修改、查找、显示、清空、排序通讯录信息的功能。通过定义结构体LINK和PEOPLE来存储通讯录信息,使用相关函数来实现各项功能。详细介绍了每个功能的实现方法。 ... [详细]
  • 本文介绍了一种图的存储和遍历方法——链式前向星法,该方法在存储带边权的图时时间效率比vector略高且节省空间。然而,链式前向星法存图的最大问题是对一个点的出边进行排序去重不容易,但在平行边无所谓的情况下选择这个方法是非常明智的。文章还提及了图中搜索树的父子关系一般不是很重要,同时给出了相应的代码示例。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
author-avatar
手机用户2602889575
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有