xll-utils 0.1.0

PE/COFF parsing and export verification utilities for Excel XLL development
Documentation

xll-utils

PE/COFF parsing and export verification utilities for Excel XLL development.

xll-utils complements xll-rs (runtime) and xllgen (proc-macros) by providing tools to inspect, verify, and manage XLL add-in binaries.

Features

  • PE/COFF parsing — Read export tables, architectures, and metadata from DLL/XLL files
  • Export verification — Verify that a built XLL contains all required exports
  • XLL metadata — Extract XLL-specific information (entry points, export lists)
  • Windows registry — Find, register, and unregister XLLs in Excel's registry keys (Windows only)
  • Build script helpers — Verify exports at compile time from build.rs
  • CLI toolxllutils binary for command-line inspection

Installation

Add to your Cargo.toml:

[dependencies]
xll-utils = "0.1"

Feature flags

Feature Default Description
serde no Enables JSON serialization for all public types
cli no Builds the xllutils CLI binary
build no Build script helpers (verify_exports_in_build, etc.)

To install the CLI:

cargo install xll-utils --features cli

Quick start

Parse a PE file and list exports

use xll_utils::pe::parse_pe_file;

let pe = parse_pe_file("path/to/my_xll.xll").unwrap();
println!("Architecture: {}", pe.architecture());
println!("Exports: {}", pe.exports().len());

for name in pe.export_names() {
    println!("  {name}");
}

Verify expected exports

use xll_utils::exports::verify_dll_exports;

let expected = &["xlAutoOpen", "xlAutoClose", "xlAutoFree12"];
let report = verify_dll_exports("my_xll.xll", expected).unwrap();

if report.complete {
    println!("All exports present");
} else {
    println!("Missing: {:?}", report.missing);
}

Extract XLL metadata

use xll_utils::xll::xll_info;

let info = xll_info("my_xll.xll").unwrap();
println!("{}: {} exports, xlAutoOpen={}", info.name, info.export_count, info.has_auto_open);

Build script verification

In your Cargo.toml:

[build-dependencies]
xll-utils = { version = "0.1", features = ["build"] }

In your build.rs:

fn main() {
    xll_utils::build::verify_exports_in_build(
        "target/release/my_xll.xll",
        &["xlAutoOpen", "xlAutoClose", "xlAutoFree12"],
    ).expect("XLL export verification failed");
}

CLI usage

xllutils list-exports my_xll.xll [-o] [-A]
xllutils verify my_xll.xll -e xlAutoOpen,xlAutoClose,xlAutoFree12 [-s]
xllutils xll-info my_xll.xll [--json]
xllutils diff first.xll second.xll
xllutils find-xlls                    # Windows only

Examples

List exports with ordinals:

$ xllutils list-exports my_xll.xll -o
my_xll.xll (x64, 9 exports)
  xlAutoOpen  ordinal=1
  xlAutoClose  ordinal=2
  xlAutoFree12  ordinal=3
  ...

Verify required exports:

$ xllutils verify my_xll.xll -e xlAutoOpen,xlAutoClose,xlAutoFree12
Verification: my_xll.xll
  Architecture: x64
  Total exports: 9
  Found: 3 / 3
  Result: OK