文档章节

从 EXE 或 DLL 中获取图标的函数 - 回复 "小李子子" 的问题

涂孟超
 涂孟超
发布于 2014/09/26 15:34
字数 364
阅读 11
收藏 0
问题来源: http://www.cnblogs.com/del/archive/2008/12/25/1070115.html#1413353

代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses ShellAPI;

{从 EXE 或 DLL 中获取 ICO 图标的函数, 需要 uses ShellAPI}
function GetIco(const ExePath: string; SavePath: string): Integer; {返回获取总数}
var
  ico: TIcon;
  i,count: Integer;
  FileName: string;
begin
  Result := 0;
  count := ExtractIcon(HInstance, PChar(ExePath), $FFFFFFFF);
  if count = 0 then Exit;

  if not DirectoryExists(SavePath) then ForceDirectories(SavePath);
  FileName := ChangeFileExt(ExtractFileName(ExePath), '');
  SavePath := ExcludeTrailingPathDelimiter(SavePath) + '\' + FileName + '_%.3d.ico';

  ico := TIcon.Create;
  for i := 0 to count - 1 do
  begin
    ico.Handle := ExtractIcon(HInstance, PChar(ExePath), i);
    ico.SaveToFile(Format(SavePath, [i+1]));
  end;
  ico.Free;
  Result := count;
end;

{测试: 获取当前程序图标}
procedure TForm1.Button1Click(Sender: TObject);
begin
  GetIco(ParamStr(0), 'c:\temp');
end;

{测试: 获取记事本图标}
procedure TForm1.Button2Click(Sender: TObject);
var
  buf: array[0..MAX_PATH] of Char;
begin
  GetSystemDirectory(buf, Length(buf)*SizeOf(buf[0]));
  GetIco(buf + '\notepad.exe', 'c:\temp');
end;

{测试: 获取 Windows 的标准图标库}
procedure TForm1.Button3Click(Sender: TObject);
var
  buf: array[0..MAX_PATH] of Char;
begin
  GetSystemDirectory(buf, Length(buf)*SizeOf(buf[0]));
  GetIco(buf + '\Shell32.dll','c:\temp');
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 194
  ClientWidth = 206
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 64
    Top = 32
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 64
    Top = 80
    Width = 75
    Height = 25
    Caption = 'Button2'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 64
    Top = 127
    Width = 75
    Height = 25
    Caption = 'Button3'
    TabOrder = 2
    OnClick = Button3Click
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/12/26/1362860.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
Inno Setup 制作jar转EXE文件的安装包 之权限、图标、卸载菜单的问题

·怎么给在开始菜单中增加卸载快捷方式? 在相应节点下,添加以下代码 ·怎么自定义卸载图标? (例中卸载图标名字为:uninstallico.ico) 下载一个UpdateIcon.dll放在同一个文件夹下(JAR、脚...

周田
2016/07/08
50
0
代码注入的三种方法

http://www.vckbase.com/index.php/wv/1580 目录 Windows 钩子 CreateRemoteThread 和 LoadLibrary 技术 ――进程间通信 CreateRemoteThread 和 WriteProcessMemory 技术 ――如何用该技术子......

nothingfinal
2012/08/31
0
0
Yunlong/CPP-ThreadInject

#C++ 线程注入 写在前面,本人C++纯小白,公开项目是希望获得更多朋友的帮助,如果您正好能解决我目前遇到的问题,希望您能在问题中回复我,项目改进后会继续保持开源,感谢大家的支持 编译 ...

Yunlong
2015/07/08
0
0
MFC获取程序安装目录

描述: 对office做插件 使用DLL注入方式 目的: 获取DLL文件的真实路径 使用方法: GetCurrentDirectory() GetModuleFileName() 区别: GetCurrentDirectory()获取的是程序安装的目录 如:c:wind...

Norman_li
2014/03/09
0
0
c++中如何使用dll中的类该怎么写

我dll和exe都是VC2013IDE自带的编译器写的,如何在exe中使用DLL中导出的类? 比如dll里面有个A类被导出,如何在exe里面定义这个类的对象,loadlibrary()之后我就不知道该怎么写了 我查了下...

newric
2014/07/03
707
2

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
44分钟前
1
0
AVA中CAS-ABA的问题解决方案AtomicStampedReference

了解CAS(Compare-And-Swap) CAS即对比交换,它在保证数据原子性的前提下尽可能的减少了锁的使用,很多编程语言或者系统实现上都大量的使用了CAS。 JAVA中CAS的实现 JAVA中的cas主要使用的是...

码代码的小司机
46分钟前
2
0
Android JNI开发系列(十三) JNI异常处理

JNI 异常处理 JNI异常与JAVA处理异常的区别 JAVA 有异常处理机制,而JNI没有 如果JAVA中异常没有捕获,后面的代码不会执行,JNI会执行 JAVA编译时的异常,是在方法显示的声明了某一个异常,编...

蔡小鹏
59分钟前
2
0
简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。 War是...

Linux就该这么学
今天
3
0
Qt那些事0.0.7

在帮助文档(Overview - QML and C++ Integration)中随缘遇到一张图,是关于C++对象与QML整合介绍的,值得标记下来,虽然大部分功能也有所涉猎,但是还是留个记号,万一哪天我失忆了还想写Q...

Ev4n
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部