Win32 输入exe路径和exe资源id和图标路径,替换exe图标,实现函数

时间: 2023-11-27 16:50:16 浏览: 27
以下是一个实现这个功能的示例函数: ```c++ #include <Windows.h> #include <Shlwapi.h> #pragma comment(lib, "Shlwapi.lib") BOOL ReplaceExeIcon(LPCTSTR lpExePath, DWORD dwIconResourceId, LPCTSTR lpNewIconPath) { // 读取exe文件的文件头信息 HANDLE hFile = CreateFile(lpExePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { return FALSE; } IMAGE_DOS_HEADER dosHeader; DWORD dwBytesRead; if (!ReadFile(hFile, &dosHeader, sizeof(dosHeader), &dwBytesRead, NULL) || dwBytesRead != sizeof(dosHeader)) { CloseHandle(hFile); return FALSE; } SetFilePointer(hFile, dosHeader.e_lfanew + sizeof(DWORD), NULL, FILE_BEGIN); IMAGE_FILE_HEADER fileHeader; if (!ReadFile(hFile, &fileHeader, sizeof(fileHeader), &dwBytesRead, NULL) || dwBytesRead != sizeof(fileHeader)) { CloseHandle(hFile); return FALSE; } // 根据exe文件头信息找到资源表位置 DWORD dwResourceOffset = dosHeader.e_lfanew + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + fileHeader.SizeOfOptionalHeader; SetFilePointer(hFile, dwResourceOffset, NULL, FILE_BEGIN); IMAGE_RESOURCE_DIRECTORY resourceDirectory; if (!ReadFile(hFile, &resourceDirectory, sizeof(resourceDirectory), &dwBytesRead, NULL) || dwBytesRead != sizeof(resourceDirectory)) { CloseHandle(hFile); return FALSE; } // 遍历资源表,找到指定的图标资源 IMAGE_RESOURCE_DIRECTORY_ENTRY* pEntry = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)((BYTE*)&resourceDirectory + sizeof(resourceDirectory)); for (WORD i = 0; i < resourceDirectory.NumberOfNamedEntries + resourceDirectory.NumberOfIdEntries; i++, pEntry++) { if (pEntry->u1.s1.Id == (WORD)RT_GROUP_ICON) { // 找到了图标资源组,进入下一层资源表 DWORD dwNextOffset = dwResourceOffset + pEntry->u2.s2.OffsetToDirectory; SetFilePointer(hFile, dwNextOffset, NULL, FILE_BEGIN); IMAGE_RESOURCE_DIRECTORY nextResourceDirectory; if (!ReadFile(hFile, &nextResourceDirectory, sizeof(nextResourceDirectory), &dwBytesRead, NULL) || dwBytesRead != sizeof(nextResourceDirectory)) { CloseHandle(hFile); return FALSE; } IMAGE_RESOURCE_DIRECTORY_ENTRY* pNextEntry = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)((BYTE*)&nextResourceDirectory + sizeof(nextResourceDirectory)); for (WORD j = 0; j < nextResourceDirectory.NumberOfNamedEntries + nextResourceDirectory.NumberOfIdEntries; j++, pNextEntry++) { if (pNextEntry->u1.s1.Id == dwIconResourceId) { // 找到了指定的图标资源 DWORD dwIconOffset = dwResourceOffset + pNextEntry->u2.s2.OffsetToData; SetFilePointer(hFile, dwIconOffset, NULL, FILE_BEGIN); IMAGE_RESOURCE_DATA_ENTRY dataEntry; if (!ReadFile(hFile, &dataEntry, sizeof(dataEntry), &dwBytesRead, NULL) || dwBytesRead != sizeof(dataEntry)) { CloseHandle(hFile); return FALSE; } // 读取图标资源 BYTE* pIconData = new BYTE[dataEntry.Size]; if (!ReadFile(hFile, pIconData, dataEntry.Size, &dwBytesRead, NULL) || dwBytesRead != dataEntry.Size) { delete[] pIconData; CloseHandle(hFile); return FALSE; } // 替换图标资源 HANDLE hNewIcon = LoadImage(NULL, lpNewIconPath, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); if (hNewIcon == NULL) { delete[] pIconData; CloseHandle(hFile); return FALSE; } ICONINFO iconInfo; if (!GetIconInfo((HICON)hNewIcon, &iconInfo)) { delete[] pIconData; CloseHandle(hFile); DestroyIcon((HICON)hNewIcon); return FALSE; } DWORD dwNewIconSize = iconInfo.dwBytesInRes; BYTE* pNewIconData = new BYTE[dwNewIconSize]; if (!GetIconResourceData(iconInfo.hResInfo, pNewIconData, dwNewIconSize)) { delete[] pIconData; delete[] pNewIconData; CloseHandle(hFile); DestroyIcon((HICON)hNewIcon); return FALSE; } memcpy(pIconData, pNewIconData, dwNewIconSize); // 写入替换后的图标资源 SetFilePointer(hFile, dwIconOffset + sizeof(IMAGE_RESOURCE_DATA_ENTRY), NULL, FILE_BEGIN); if (!WriteFile(hFile, pIconData, dataEntry.Size, &dwBytesRead, NULL) || dwBytesRead != dataEntry.Size) { delete[] pIconData; delete[] pNewIconData; CloseHandle(hFile); DestroyIcon((HICON)hNewIcon); return FALSE; } delete[] pIconData; delete[] pNewIconData; CloseHandle(hFile); DestroyIcon((HICON)hNewIcon); return TRUE; } } } } CloseHandle(hFile); return FALSE; } ``` 调用示例: ```c++ ReplaceExeIcon(TEXT("C:\\MyApp.exe"), 101, TEXT("C:\\NewIcon.ico")); ``` 其中,`lpExePath` 参数为需要替换图标的exe文件路径,`dwIconResourceId` 参数为需要替换的图标资源的ID,`lpNewIconPath` 参数为新的图标文件路径。如果函数执行成功,则返回 `TRUE`,如果失败,则返回 `FALSE`。

相关推荐

最新推荐

recommend-type

Python实现调用另一个路径下py文件中的函数方法总结

主要介绍了Python实现调用另一个路径下py文件中的函数方法,结合实例形式总结分析了Python针对不同文件夹中py文件调用操作的处理技巧与相关注意事项,需要的朋友可以参考下
recommend-type

在html的img src=""中调用js函数或js变量来动态指定图片路径

正如标题所言,如何调用js的函数或者js变量来指定图片路径,此种需求特别适合在某些特殊的情况下,这里有几个方法,在实验中,需要的朋友可以参考下
recommend-type

python类和函数中使用静态变量的方法

主要介绍了python类和函数中使用静态变量的方法,实例分析了三种常用的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
recommend-type

Linux 进程替换(exec函数)实现代码

主要介绍了Linux 进程替换(exec函数)实现代码的相关资料,需要的朋友可以参考下
recommend-type

广州大学 数据结构实验报告 实验四 查找和排序算法实现

实验四 查找和排序算法...用随机函数生成16个2位正整数(10~99),实现插入排序、选择排序、冒泡排序、双向冒泡、快速排序、二路归并排序等多种排序算法,输出排序中间过程、统计关键字的比较次数和记录的移动次数。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。