@@更改exe图标后,运行不了@@

pb8 2012-12-01 09:15:05
请教大侠,我写了个dll给第三方调用,exe图标能够修改成功,用来替换的图标与原来的图标规格和大小都一样的,但修改后的exe变小了,图标能修改成功,但exe运行不了,用procmon查看有运行,但运行一下后进程关闭了,请大侠指教
extern "C" _declspec(dllexport) bool _stdcall changeexeicon(char* ExeFile,char* IconFile)
{
ICONDIR stID;
ICONDIRENTRY stIDE;
GRPICONDIR stGID;
HANDLE hFile;
DWORD nSize, nGSize, dwReserved;
HANDLE hUpdate;
PBYTE pIcon, pGrpIcon;
BOOL ret;

hFile = CreateFile(IconFile, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return false;
}

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);
if (!ret)
{
CloseHandle(hFile);
return false;
}

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(ExeFile, false);
ret = UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)pGrpIcon, nGSize);
ret = UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)pIcon, nSize);
EndUpdateResource(hUpdate, false);
if (!ret)
{
CloseHandle(hFile);
return false;
}

CloseHandle(hFile);
return true;
}
...全文
479 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
f472969530 2014-11-21
  • 打赏
  • 举报
回复
引用 12 楼 VisualEleven 的回复:
[quote=引用 11 楼 pb8 的回复:] 引用 9 楼 VisualEleven 的回复: http://blog.csdn.net/visualeleven/article/details/5754831 试过了,结果一样的~
我测试了一下,没有问题的[/quote] 运行完有内存泄露,杂没问题了。
Eleven 2012-12-04
  • 打赏
  • 举报
回复
还有你代码中分配的内存怎么没看到你释放?
pb8 2012-12-04
  • 打赏
  • 举报
回复
引用 7 楼 luciferisnotsatan 的回复:
ret = UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)pGrpIcon, nGSize); ret = UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)pIcon, nSize)……
用reshaker查看能看到已经修改成功了
luciferisnotsatan 2012-12-04
  • 打赏
  • 举报
回复
ret = UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)pGrpIcon, nGSize); ret = UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)pIcon, nSize); 万一上边那个失败了怎么办? 自己写个exe替换后试试,同样有问题就是程序问题,不然可能第三方exe有什么验证机制。
Tiger-3D 2012-12-04
  • 打赏
  • 举报
回复
这~~~~~~不是版主吗,难得见版主以版主ID发一次帖子,无论如何也要顶
pb8 2012-12-04
  • 打赏
  • 举报
回复
等待高人~~~
Eleven 2012-12-04
  • 打赏
  • 举报
回复
引用 13 楼 pb8 的回复:
引用 12 楼 VisualEleven 的回复: 引用 11 楼 pb8 的回复: 引用 9 楼 VisualEleven 的回复: http://blog.csdn.net/visualeleven/article/details/5754831 试过了,结果一样的~ 我测试了一下,没有问题的 谢谢! 请问你的图标规格和图标大小是不是完全一致的?我的是不一致的情况,新图标(用来替……
我用的是16*16的图标,替换了VS2008SP1编出来的demo程序(就是MFC的那个图标)
赵4老师 2012-12-04
  • 打赏
  • 举报
回复
在新图标数据的后面填0凑够旧图标的大小。
赵4老师 2012-12-04
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
pb8 2012-12-04
  • 打赏
  • 举报
回复
引用 12 楼 VisualEleven 的回复:
引用 11 楼 pb8 的回复: 引用 9 楼 VisualEleven 的回复: http://blog.csdn.net/visualeleven/article/details/5754831 试过了,结果一样的~ 我测试了一下,没有问题的
谢谢! 请问你的图标规格和图标大小是不是完全一致的?我的是不一致的情况,新图标(用来替换的)图标小于原图标
Eleven 2012-12-04
  • 打赏
  • 举报
回复
引用 11 楼 pb8 的回复:
引用 9 楼 VisualEleven 的回复: http://blog.csdn.net/visualeleven/article/details/5754831 试过了,结果一样的~
我测试了一下,没有问题的
pb8 2012-12-04
  • 打赏
  • 举报
回复
引用 9 楼 VisualEleven 的回复:
http://blog.csdn.net/visualeleven/article/details/5754831
试过了,结果一样的~
redleaves 2012-12-01
  • 打赏
  • 举报
回复
第三方的EXE么?是不是有什么校验机制啊. 调试运行一下,看是为什么退出再说啊.
xiaoji0507 2012-12-01
  • 打赏
  • 举报
回复
还有连版主都解决不了的问题啊 我是来蹭点分的
prajna 2012-12-01
  • 打赏
  • 举报
回复
要找到退出的具體原因,很不容易,頂一下,等高人出現。
flyrack 2012-12-01
  • 打赏
  • 举报
回复
变小了不应该啊 要不试下一个字节一个字节的替换图标
项目名称微信小程序教学管理系统+后台管理系统视频效果系统说明根据对系统的需求分析,本系统将分为4个模块:学生管理:管理学生的基本信息,包括个人信息的添加、修改、删除,以及选课信息的添加。科目管理:科目的基本信息,包括科目信息的添加、修改和删除。成绩管理:管理学生的选课的成绩信息,包括成绩的登记与修改。班级管理:对班级信息的管理,包括班级的增加、修改、删除、查询等。 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;4. 运行项目,在浏览器中输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧