#资源 #图标 #版本 #版本字符串 #Windows

winres-edit

加载、创建和修改现有可执行文件(.exe或.res)中的Windows资源

3个版本 (重大更新)

0.2.0 2023年3月20日
0.1.0 2022年12月20日
0.0.0 2022年12月10日

#125 in Windows API

每月32次下载
cargo-nw 中使用

Apache-2.0 OR MIT

47KB
933

winres-edit

用于修改Windows资源的Crate。

github crates.io docs.rs license

概述

此Crate允许您在.exe和.res文件中创建、加载和修改Windows资源。此Crate目前不支持除版本字符串(VS_VERSION_INFO)之外的资源数据的实际解构,这对于修改应用程序清单非常有用。加载的资源以原始的Vec数据形式提供,用于修改位图和图标。

请注意,在打开的资源文件上执行的所有操作都会累积,并在关闭文件时使用close()函数“刷新”到文件中。这是由于此Crate使用的底层Win32 API(UpdateResource)的功能行为。

示例

修改图标数据和资源字符串

let mut resources = Resources::new(&Path::new("myfile.exe"));
resources.load().expect("Unable to load resources");
resources.open().expect("Unable to open resource file for updates");

resources.find(resource_type::ICON,Id::Integer(1))
    .expect("unable to find main icon")
    .replace(icon_data)?
    .update()?;

let version: [u16;4] = [0,1,0,0];
resources.get_version_info()?.expect("Unable to get version info")
    .set_file_version(&version)
    .set_product_version(&version)
    .insert_strings(
        &[
            ("ProductName","My Product")
            ("FileDescription","My File")
        ]
    )
    .remove_string("SomeExistingString")
    .update()?;

// make sure to explicitly call close() as that flushes all the session changes
resources.close();

添加新图标

let res = Resource::new(
    &resources,
    resource_type::ICON.into(),
    Id::Integer(14).into(),
    1033,
    target_icon.data(),
);
res.update()?;

图标

此Crate与ico crate协同工作良好,该crate可以用来加载/存储外部的.ico文件,以及加载.png文件并将它们编码成Windows兼容的资源格式。

示例

let iconfile = std::fs::File::open("myicon.ico").unwrap();
let icon_dir = ico::IconDir::read(iconfile).unwrap();    
let target_icon = icon_dir
    .entries()
    .iter()
    .find(|&e| e.width() == 256)
    .expect("can't find 256x256 icon");
let icon_data = target_icon.data();

此Crate还与image crate协同工作良好,该crate可以与ico crate交互,在资源文件中加载、调整大小和存储自定义图标。

依赖关系

~131MB
~2M SLoC