[工具-001]C++更换EXE的ICON图标
我们都知道每个可执行文件EXE都会有自己的图标,它可以在项目生成的时候进行指认,但是有时候我们会遇到两种情况:1.没有源代码,2.我们的项目很多,一个个进行更换很耗时。本人就是因为接到这么一个需求,要用C#做一个批量更换EXE图标的工具,我找了很多的资料,C#并没有提供这方面的API。后面偶然的看到了C++有很多这方面的资料,然后我就有个想法,把C++的代码哪来,然后打成DLL动态链接库不就可以供C#调用了吗?
下面就我参考的代码贴出。
首先贴出.H的文件
#ifndef _MYCODE_H_ #define _MYCODE_H_ #ifdef DLLDEMO1_EXPORTS #define EXPORTS_DEMO _declspec( dllexport ) #else #define EXPORTS_DEMO _declspec(dllimport) #endif extern "C" EXPORTS_DEMO void ChangeIcon(char* szFileName,char* szIconFile); #endif
然后贴出.CPP文件
#include "stdafx.h"
#include "IconChange.h"
#include <windows.h>
#include <string> using namespace std; struct TIconHeader
{
WORD idReserved;
WORD idType;
WORD idCount; // 目录数
}; #pragma pack(1)
struct TResDirHeader
{
BYTE bWidth; // 图像宽度,以象素为单位。一个字节
BYTE bHeight; // 图像高度,以象素为单位。一个字节
BYTE bColorCount; // 图像中的颜色数(如果是>=8bpp的位图则为0)
BYTE bReserved; // 保留字必须是0
WORD wPlanes; // 标设备说明位面数,其值将总是被设为1
WORD wBitCount; // 每象素所占位数
DWORD lBYTEsInRes; // 每份资源所占字节数
DWORD lImageOffset; // 图像数据(iconimage)起点偏移位置
};
#pragma pack() typedef struct TIconResDirGrp
{
TIconHeader idHeader ;
TResDirHeader idEntries[]; } *PIconResDirGrp; // =+=+=+=+=+=+=+=+=+=+=+=+=+=+= WORD MakeLangID(); // =+=+=+=+=+=+=+=+=+=+=+=+=+=+= WORD MakeLangID()
{
return (SUBLANG_ENGLISH_US << ) | LANG_ENGLISH;
} // =+=+=+=+=+=+=+=+=+=+=+=+=+=+= void ChangeIcon(char* szFileName,char* szIconFile)
{ int i,FileGrpSize;
DWORD dwFileSize,dwBytesRead;
void * filemem,*p;
PIconResDirGrp FileGrp;
HANDLE hFile,hUpdateRes;
char* szResName = "AyIcon";
WCHAR szFileNameWCHAR[MAX_PATH]={};
WCHAR szIconFileWCHAR[MAX_PATH]={};
WCHAR szResNameWCHAR[MAX_PATH]={}; MultiByteToWideChar(CP_ACP, , szFileName, -,
szFileNameWCHAR, sizeof(szFileNameWCHAR)); MultiByteToWideChar(CP_ACP, , szIconFile, -,
szIconFileWCHAR, sizeof(szIconFileWCHAR)); MultiByteToWideChar(CP_ACP, , szResName, -,
szResNameWCHAR, sizeof(szResNameWCHAR)); // open the icon file
hFile=CreateFile(szIconFileWCHAR,GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, ); if (hFile==INVALID_HANDLE_VALUE)
{
MessageBox(,L"Failed open Icon File!",NULL,);
return;
} // get the file size
dwFileSize = GetFileSize(hFile,NULL); filemem=malloc(dwFileSize); // read file to memory
ReadFile(hFile,filemem, dwFileSize,&dwBytesRead,NULL); CloseHandle(hFile); // assume the TIconResDirGrp STRUCT
FileGrp=PIconResDirGrp(filemem); // get Icon_Header size
FileGrpSize=sizeof(TIconResDirGrp)+(FileGrp->idHeader.idCount-)
*sizeof(TResDirHeader); // begin to change the resource
hUpdateRes=BeginUpdateResource(szFileNameWCHAR, false); // change all frames'resource
for(i=;i<FileGrp->idHeader.idCount;i++)
{ p=(void *)((DWORD)filemem+FileGrp->idEntries[i].lImageOffset); // change every frame
UpdateResource(hUpdateRes,RT_ICON,
MAKEINTRESOURCE(FileGrp->idEntries[i].lImageOffset)
, MakeLangID(), p, FileGrp->idEntries[i].lBYTEsInRes);
} // update header information
UpdateResource(hUpdateRes,RT_GROUP_ICON, szResNameWCHAR, MakeLangID(),
FileGrp, FileGrpSize); EndUpdateResource(hUpdateRes, false);
free(filemem);
}
以上就是所有CCP代码。有需要的可以参考下
结语
- 受益,C++能操作的底层更多,学会了打DLL包

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4489019.html
[工具-001]C++更换EXE的ICON图标的更多相关文章
- 更换用installshield打包生成exe文件的图标【转】
最近在研究用installshield2010为自己做的产品打包,自己在网上找写资料,胡乱折腾,最后弄成了一个exe安装包,想要修改exe文件的图标,发现Basic MSI project 无法用in ...
- 【Electron】Electron Icon 图标说明、及常见问题
[Electron]Electron Icon 图标说明.及常见问题 其实各种打包模块都有相关的文档说明,相关链接如下: electron-builder:https://www.electron.b ...
- 字体在网页中画ICON图标
用字体在网页中画ICON图标有三种小技巧: 1.用CSS Sprite在网页中画小图标 实现方法: 首先将小图片整合到一张大的图片上 然后根据具体图标在大图上的位置,给背景定位.background- ...
- 目标指向、Icon图标的错误
VS打包后生成快捷方式:目标指向.Icon图标的错误 1.目标指向错误: 在安装***.msi文件后,对快捷方式-->右键-->属性: 发现目标并非指exe文件. 于是我新建了一个快捷方式 ...
- 从 C#编写的Exe里面提取图标和图片
记得原来是可以通过PE直接提取Exe里面的图片的,不知道为什么不能用了,下面是通过加载程序集反射出Resources 里面的图片或者图标: 提取结果直接存放到编译目录了,不知道向左向右,自己又回到Wi ...
- VS打包后生成快捷方式:目标指向错误、Icon图标分辨率有误问题解决方案
1.目标指向错误: 在安装***.msi文件后,对快捷方式-->右键-->属性: 发现目标并非指exe文件. 于是我新建了一个快捷方式,将目标-->指向exe文件,位置Ctrl+v. ...
- qt exe文件添加图标
Qt 怎样生成带图标的exe(转载) 一.问题描述 当我们在 Windows 下用 VS 生成 exe 程序时,如果窗口程序指定了图标,那么生成的 exe 程序便是指定的图标模样. 但是,当使用 Qt ...
- 用字体在网页中画Icon图标
第一步,下载.IcoMoon网站选择字体图标并下载,解压后将fonts文件夹放在工程目录下.fonts文件夹内有四种格式的字体文件: 注:由于浏览器对每种字体的支持程度不一致,要想在所有浏览器中都显示 ...
- JS组件系列——不容错过的两款Bootstrap Icon图标选择组件
前言:最近好多朋友在群里面聊到bootstrap icon图标的问题,比如最常见的菜单管理,每个菜单肯定需要一个对应的菜单图标,要是有一个可视化的图标选择组件就好了,最好是直接选择图标,就能得到对应的 ...
随机推荐
- 【Python】Django2.0集成Celery4.1详解
环境准备 Python3.6 pip install Django==2.0.1 pip install celery==4.1.0 pip install eventlet (加入协程支持) 安装e ...
- HTTP请求头中的X-Forwarded-For介绍
概述 我们在做nginx方向代理的时候,为了记录整个代理过程,我们往往会在配置文件中加上如下配置: location ^~ /app/download/ { ... proxy_set_header ...
- Java——多线程之Lock锁
Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...
- CSS设计超链接样式
\(\color{Red}{首先设计一下静止的a标签}\) a{ margin-right:10px;/*右边距,其他边距同理*/ border-bottom:1px solid #eec/*分别是下 ...
- 12_JavaScript基础入门(2)
运算符 运算符(Operators,也翻译为操作符),是发起运算的最简单形式. 运算符的分类见仁见智,我们的课程对运算符进行如下分类: 数学运算符(Arithmetic operators) ...
- C#学习笔记——数据类型
数据类型 sbyte x; //8bit,有符号,表示-128~127 bite x; //8bit,无符号,表示0~255 short x; //16bit,有符号整型 ushort x; //16 ...
- Day_08【面向对象】扩展案例1_测试项目经理类和程序员类
分析以下需求,并用代码实现: 1.定义项目经理类 属性: 姓名 工号 工资 奖金 行为: 工作work 2.定义程序员类 属性: 姓名 工号 工资 行为: 工作work 要求: 向上抽取一个父类,让这 ...
- LeetCode最长回文子串
题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: & ...
- IDEA 创建Spring项目后org.springframework.boot报错
IDEA 创建 Spring boot 项目后 ,在pom.xml文件中 org.springframework.boot出错,刷新也没有作用. 如图: 可以降低 org.springframewor ...
- opengl简单入门实例
实现任务目标: 使用纹理贴图,增强可视效果 应用坐标变换,实现场景中不同物体重建 采用双缓冲技术,实现场景实时绘制 具有一定的鼠标.键盘交互功能 先放效果 鼠标的交互功能有:右键暂停转动,左键继续转动 ...