@@更改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;
}
...全文
511 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
变小了不应该啊 要不试下一个字节一个字节的替换图标

65,187

社区成员

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

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