一、前言
ombra工具中最基本的一个功能就是能够快捷打开本地所有应用,找到程序本身不难,难的是怎么才能拿到该程序的图标。
经过我的搜寻,网上并没有好用的现成库,所以本文介绍一下我的实现方案。
二、简单介绍
exe程序图标在编译的时候就已经被编译进了exe文件中,所以想要拿到图标,就得解析exe文件格式,也叫PE文件,其内部构造是比较复杂的,又尤其是各种资源。
但好在有现成的库可以帮我们完成这一解析操作:pelite。
这里是rust库,其它语言一般也会有对应的库实现。
首先在依赖中引入该库:
[dependencies]
pelite = "0.10.0"
它的使用还是比较简单的:
use pelite::pe32::{Pe, PeFile};
use pelite::FileMap;
fn main() {
let file_map = FileMap::open(r"D:\Install\TreeSizeProv9.exe").unwrap();
let file = PeFile::from_bytes(file_map.as_ref()).unwrap_or_else(|e| {
println!("{}", e);
panic!();
});
let resources = file.resources().unwrap();
for (name, group) in resources.icons().filter_map(Result::ok) {
for entry in group.entries() {
match group.image(entry.nId) {
Ok(image) => {
//得到图片数据
}
Err(err) => {
println!("{}: Error {}!", name, err)
}
}
}
}
}
上面的代码基本就是直接复制的该库实例代码,只不过由于我这里暂时是32位的程序,所以最前面导入的是pe32
中的包。
提取图标的时候有几点要注意: