diff --git a/test/standalone/windows_resources/build.zig b/test/standalone/windows_resources/build.zig index d3afadb60d..3b140c90f7 100644 --- a/test/standalone/windows_resources/build.zig +++ b/test/standalone/windows_resources/build.zig @@ -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); } diff --git a/test/standalone/windows_resources/main.zig b/test/standalone/windows_resources/main.zig index f92e18124b..9af7941036 100644 --- a/test/standalone/windows_resources/main.zig +++ b/test/standalone/windows_resources/main.zig @@ -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;