authorgravatar for reuben.dunnington@gmail.comReuben Dunnington <reuben.dunnington@gmail.com> 2025-01-05 19:36:52-08:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-01-06 15:56:21+01:00
loga7a5f3506b74651235ba7112ce38b7c3205d0527
tree1fffaeeb79b7e9fc3527257b61597d13dc824c2b
parent745d3ed0ac1ad1ec8c72d1b432f79e40a1917cde

fix win32 manifest ID for DLLs

* MSDN documentation page covering what resource IDs manifests should have: https://learn.microsoft.com/en-us/windows/win32/sbscs/using-side-by-side-assemblies-as-a-resource * This change ensures shared libraries that embed win32 manifests use the proper ID of 2 instead of 1, which is only allowed for .exes. If the manifest uses the wrong ID, it will not be found and is essentially ignored.

1 files changed, 10 insertions(+), 2 deletions(-)

src/Compilation.zig+10-2
...@@ -5056,9 +5056,17 @@ fn updateWin32Resource(comp: *Compilation, win32_resource: *Win32Resource, win32...@@ -5056,9 +5056,17 @@ fn updateWin32Resource(comp: *Compilation, win32_resource: *Win32Resource, win32
5056 }5056 }
5057 }.fmtRcEscape;5057 }.fmtRcEscape;
50585058
5059 // 1 is CREATEPROCESS_MANIFEST_RESOURCE_ID which is the default ID used for RT_MANIFEST resources5059 // https://learn.microsoft.com/en-us/windows/win32/sbscs/using-side-by-side-assemblies-as-a-resource
5060 // WinUser.h defines:
5061 // CREATEPROCESS_MANIFEST_RESOURCE_ID to 1, which is the default
5062 // ISOLATIONAWARE_MANIFEST_RESOURCE_ID to 2, which must be used for .dlls
5063 const resource_id: u32 = if (comp.config.output_mode == .Lib and comp.config.link_mode == .dynamic) 2 else 1;
5064
5060 // 24 is RT_MANIFEST5065 // 24 is RT_MANIFEST
5061 const input = try std.fmt.allocPrint(arena, "1 24 \"{s}\"", .{fmtRcEscape(src_path)});5066 const resource_type = 24;
5067
5068 const input = try std.fmt.allocPrint(arena, "{} {} \"{s}\"", .{ resource_id, resource_type, fmtRcEscape(src_path) });
5069
5062 try o_dir.writeFile(.{ .sub_path = rc_basename, .data = input });5070 try o_dir.writeFile(.{ .sub_path = rc_basename, .data = input });
50635071
5064 var argv = std.ArrayList([]const u8).init(comp.gpa);5072 var argv = std.ArrayList([]const u8).init(comp.gpa);