热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Delphi替换PE图标资源

programProject2;usesWindows,Classes;typeicondirentrypackedrecordbwidth:Byte;该
program Project2;

uses
  Windows,Classes;

type
    icondirentry=packed record
       bwidth:Byte;     //该目录对应的资源的宽度
       bheight:Byte;   //该目录对应的资源的高度
       bcolorcount:Byte;    //该目录对应的资源的颜色总数,大于8的资源该值为零
       breserved:Byte; //保留
       wplanes:word; //指定的设备号,如无意外,该值总是为1
       wbitcount:word; //该目录对应的资源的位数(色深)
       dwbytesinres:Dword;   //该目录对应的资源占用的字节数
       dataoffset:Dword; //该目录对应的资源在文件中的位置(偏移量)
     end;

     iconheader=packed record
       idreserved:word; //保留
       idtype:word; //资源类型,图标文件为1,光标文件为2
       idcount:word; //该ico文件中共有几个图标,该值决定了icondirentry结构的数目,可见一个ico文件中可能包含几个图标的数据,替换到exe中要分别考虑。
     end;

var
   icofile:Tmemorystream;
   Uh:Cardinal;
   rdata:Pbyte;
   header:iconheader;
   Dgroup:array of icondirentry;
   i,besti,bestc,bestsize:integer;
   SourceIcon,TargetFile:String;
begin
   SourceIcon:='C:/Program Files/58.ico'; //图标16x16规格
   TargetFile:='C:/Program Files/1.exe';
   icofile:=Tmemorystream.Create;
   icofile.LoadFromFile(Pchar(SourceIcon)); //SourceIcon可以换成ico文件的名称
   icofile.Position:=0;
   icofile.ReadBuffer(header,sizeof(header));
   setlength(Dgroup,header.idcount);   //空出一位,防止出错
   bestc:=0;
   bestsize:=0;
   for i := 0 to header.idcount-1 do    //忽略空出的一位
   begin
       icofile.ReadBuffer(Dgroup[i],Sizeof(Dgroup[i]));
       if Dgroup[i].wbitcount>bestc then                  //找到最适合做主图标的图标数据
         if Dgroup[i].bwidth>=bestsize then               //同上
         begin
             bestc:=Dgroup[i].wbitcount;
             bestsize:=Dgroup[i].bwidth;
             besti:=i;
         end;
   end;
   icofile.Position:=Dgroup[besti].dataoffset;
   getmem(rdata,Dgroup[besti].dwbytesinres);
   icofile.ReadBuffer(rdata^,Dgroup[besti].dwbytesinres);

   Uh:=Beginupdateresource(Pchar(TargetFile),false);
   updateresource(Uh,RT_ICON,pchar(chr(6)),2052,rdata,Dgroup[besti].dwbytesinres); //替换6号位置
endupdateresource(Uh,false);

   icofile.Free;

end.

推荐阅读
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文介绍了如何解决 ChinaASP.Upload 错误 '80040002',即必须添加版权信息的问题,并提供了详细的步骤和注意事项。 ... [详细]
  • 在现代Web开发中,HTML5 Canvas常用于图像处理和绘图任务。本文将详细介绍如何将Canvas中的图像导出并上传至服务器,适用于拼图、图片编辑等场景。 ... [详细]
  • 首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析
    首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • Redis 是一个高性能的开源键值存储系统,支持多种数据结构。本文将详细介绍 Redis 中的六种底层数据结构及其在对象系统中的应用,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象。通过12张图解,帮助读者全面理解 Redis 的数据结构和对象系统。 ... [详细]
  • 探讨在内核中集成头文件的可行性与好处,特别是在处理外部模块和BPF应用时的作用。 ... [详细]
  • 在Qt框架中,信号与槽机制是一种独特的组件间通信方式。本文探讨了这一机制相较于传统的C风格回调函数所具有的优势,并分析了其潜在的不足之处。 ... [详细]
  • NPM 脚本 'start' 退出,未显示 create-react-app 服务器正在监听请求
    遇到 NPM 脚本 'start' 退出且未显示 create-react-app 服务器正在监听请求的问题,请求帮助。 ... [详细]
  • 解决网页乱码问题的实用方法
    网页乱码问题在开发中较为常见,主要由文件编码、程序字符集设置和数据库连接字符集设置不当引起。本文将详细介绍如何逐一排查并解决这些问题。 ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
  • ipsec 加密流程(二):ipsec初始化操作
    《openswan》专栏系列文章主要是记录openswan源码学习过程中的笔记。Author:叨陪鲤Email:vip_13031075266163.comDate:2020.1 ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
author-avatar
手机用户2502891655
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有