我们都知道每个可执行文件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图标的更多相关文章

  1. 更换用installshield打包生成exe文件的图标【转】

    最近在研究用installshield2010为自己做的产品打包,自己在网上找写资料,胡乱折腾,最后弄成了一个exe安装包,想要修改exe文件的图标,发现Basic MSI project 无法用in ...

  2. 【Electron】Electron Icon 图标说明、及常见问题

    [Electron]Electron Icon 图标说明.及常见问题 其实各种打包模块都有相关的文档说明,相关链接如下: electron-builder:https://www.electron.b ...

  3. 字体在网页中画ICON图标

    用字体在网页中画ICON图标有三种小技巧: 1.用CSS Sprite在网页中画小图标 实现方法: 首先将小图片整合到一张大的图片上 然后根据具体图标在大图上的位置,给背景定位.background- ...

  4. 目标指向、Icon图标的错误

    VS打包后生成快捷方式:目标指向.Icon图标的错误 1.目标指向错误: 在安装***.msi文件后,对快捷方式-->右键-->属性: 发现目标并非指exe文件. 于是我新建了一个快捷方式 ...

  5. 从 C#编写的Exe里面提取图标和图片

    记得原来是可以通过PE直接提取Exe里面的图片的,不知道为什么不能用了,下面是通过加载程序集反射出Resources 里面的图片或者图标: 提取结果直接存放到编译目录了,不知道向左向右,自己又回到Wi ...

  6. VS打包后生成快捷方式:目标指向错误、Icon图标分辨率有误问题解决方案

    1.目标指向错误: 在安装***.msi文件后,对快捷方式-->右键-->属性: 发现目标并非指exe文件. 于是我新建了一个快捷方式,将目标-->指向exe文件,位置Ctrl+v. ...

  7. qt exe文件添加图标

    Qt 怎样生成带图标的exe(转载) 一.问题描述 当我们在 Windows 下用 VS 生成 exe 程序时,如果窗口程序指定了图标,那么生成的 exe 程序便是指定的图标模样. 但是,当使用 Qt ...

  8. 用字体在网页中画Icon图标

    第一步,下载.IcoMoon网站选择字体图标并下载,解压后将fonts文件夹放在工程目录下.fonts文件夹内有四种格式的字体文件: 注:由于浏览器对每种字体的支持程度不一致,要想在所有浏览器中都显示 ...

  9. JS组件系列——不容错过的两款Bootstrap Icon图标选择组件

    前言:最近好多朋友在群里面聊到bootstrap icon图标的问题,比如最常见的菜单管理,每个菜单肯定需要一个对应的菜单图标,要是有一个可视化的图标选择组件就好了,最好是直接选择图标,就能得到对应的 ...

随机推荐

  1. 常用设计模式的实现,以及Netty中的设计模式

    1.观察者模式 有两个角色,观察者和被观察者.当被观察者发出消息后,注册了的观察者会收到其消息,而没有注册的观察者就不会收到. //定义观察者接口 interface Observer{ //通知观察 ...

  2. 在web中使用shiro(会话管理,登出,shiro标签库的使用)

    在shiro的主配置文件中配置,登出的请求经过的过滤器就可以了,在shiro的过滤器中有一个名称为logout的过滤 器专门为我们处理登出请求: 一.shiro会话管理器 shiro中也提供了类似于w ...

  3. Python3 迭代器与生成器 - 学习笔记

    可迭代对象(Iterable) 迭代器(Iterator) 定义 迭代器和可迭代对象的区别 创建一个迭代器 创建一个迭代器类 使用内置iter()函数 StopIteration异常 生成器(gene ...

  4. python学习之循环语句的使用

    循环语句主要有while和for循环两大类,接下来先看下while循环 1.while循环(python里没有do while循环语句) while 条件: 代码块 执行程序 2.for循环(可以取二 ...

  5. vue-cli3.0读取外部化配置文件来修改公共路径

    之前我写过一篇通过nginx配置代理转发的博客,正常来说也是正确的,但不足之处在了甲方还用了F5负载均衡和gateway来代理转发.所以之前我认为的请求->nginx转发代理->后端服务, ...

  6. dumpsys-package

    dumpsys-package ams和pms是android系统最重要的系统服务,本文解析dumpsys package命令,看哪些PMS相关的系统信息,数据结构是运行时可以查看的. 命令提示 co ...

  7. [hdu5254]BFS

    题意:如果一个格子的相邻四个格子中存在两个格子被标记,且这两个格子有公共点,那么这个格子也被标记.给定初始的标记状态,求最终有多少个格子被标记了 思路: 依次对每个格子进行处理,看它能否”生成“新的被 ...

  8. @Resource、@Autowired等几个注解的区别

    1.@Resource注解和@Autowired的区别 @Autowired注解:是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false ...

  9. 前端面试题-TCP和UDP的区别

    TCP和UDP的区别 (1)TCP是面向连接的,udp是无连接的即发送数据前不需要先建立链接. (2)TCP提供可靠的服务.也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UD ...

  10. PAT 1028 List Sorting (25分) 用char[],不要用string

    题目 Excel can sort records according to any column. Now you are supposed to imitate this function. In ...