热门标签 | 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.

推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • JAVA调用存储过程CallableStatement对象的方法及使用示例
    本文介绍了使用JAVA调用存储过程CallableStatement对象的方法,包括创建CallableStatement对象、传入IN参数、注册OUT参数、传入INOUT参数、检索结果和OUT参数、处理NULL值等。通过示例代码演示了具体的调用过程。 ... [详细]
  • ID卡的读取方式其实是模拟一个键盘的录入而已,很简单,现在这个ID卡读取方法是为了在任何情况下把它正确读取出来的方法,例如你在tedit控件里面,当读取了ID卡时,会和其它数据混在一起,而我这种 ... [详细]
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社区 版权所有