windows_resources standalone test: Load a resource and check its data

Just a potential way to catch regressions and to ensure the resources actually make it into the binary correctly.
This commit is contained in:
Ryan Liptak 2026-01-13 02:36:21 -08:00 committed by Ryan Liptak
parent 29b7214027
commit 1655a666d5
2 changed files with 52 additions and 3 deletions

View file

@ -46,7 +46,10 @@ fn add(
.gnu => .gnu,
};
_ = exe.getEmittedBin();
const exe_run_step = b.addRunArtifact(exe);
exe_run_step.skip_foreign_checks = true;
exe_run_step.expectStdErrEqual("");
exe_run_step.expectStdOutEqual("");
test_step.dependOn(&exe.step);
test_step.dependOn(&exe_run_step.step);
}

View file

@ -1,5 +1,51 @@
const std = @import("std");
const builtin = @import("builtin");
const w = std.os.windows;
pub fn main() !void {
std.debug.print("All your {s} are belong to us.\n", .{"codebase"});
if (builtin.os.tag == .windows) {
const name = std.unicode.wtf8ToWtf16LeStringLiteral("FOO");
const RT_RCDATA = MAKEINTRESOURCEW(10);
const handle = FindResourceW(null, name, RT_RCDATA) orelse {
std.debug.print("unable to find resource: {t}\n", .{w.GetLastError()});
return error.FailedToLoadResource;
};
const res = LoadResource(null, handle) orelse {
std.debug.print("unable to load resource: {t}\n", .{w.GetLastError()});
return error.FailedToLoadResource;
};
const data_ptr = LockResource(res) orelse {
std.debug.print("unable to lock resource: {t}\n", .{w.GetLastError()});
return error.FailedToLoadResource;
};
const size = SizeofResource(null, handle);
const data = @as([*]const u8, @ptrCast(data_ptr))[0..size];
try std.testing.expectEqualSlices(u8, "foo", data);
}
}
const HRSRC = *opaque {};
const HGLOBAL = *opaque {};
fn MAKEINTRESOURCEW(id: u16) [*:0]align(1) const w.WCHAR {
return @ptrFromInt(id);
}
extern "kernel32" fn FindResourceW(
hModule: ?w.HMODULE,
lpName: [*:0]align(1) const w.WCHAR,
lpType: [*:0]align(1) const w.WCHAR,
) callconv(.winapi) ?HRSRC;
extern "kernel32" fn LoadResource(
hModule: ?w.HMODULE,
hResInfo: HRSRC,
) callconv(.winapi) ?HGLOBAL;
extern "kernel32" fn LockResource(
hResData: HGLOBAL,
) callconv(.winapi) ?w.LPVOID;
extern "kernel32" fn SizeofResource(
hModule: ?w.HMODULE,
hResInfo: HRSRC,
) callconv(.winapi) w.DWORD;