9. exe程序图标提取

一、前言

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中的包。

提取图标的时候有几点要注意:

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux