KEMBAR78
Remove `ole32.dll` dependency from `windows-core` crate for compatibility by kennykerr · Pull Request #3743 · microsoft/windows-rs · GitHub
Skip to content

Conversation

@kennykerr
Copy link
Collaborator

Some editions of Windows, mostly used internally by Microsoft, don't include ole32.dll. This update attempts to remap a handful of functions that are particularly problematic. This PR should validate that this is viable for now on Windows 11 and we just need to manually test on Windows 10 to make sure this can support the Rust toolchain in general which still targets Windows 10.

@kennykerr kennykerr changed the title Limit use of ole32.dll in Windows crates for compatibility Limit use of ole32.dll in windows-core crate for compatibility Sep 4, 2025
@kennykerr kennykerr changed the title Limit use of ole32.dll in windows-core crate for compatibility Remove ole32.dll dependency from windows-core crate for compatibility Sep 4, 2025
@riverar
Copy link
Collaborator

riverar commented Sep 4, 2025

Spot checked Windows 10 22H2 and all those functions were present in combase.dll, so looks safe so far.

@kennykerr
Copy link
Collaborator Author

Thanks, I also manually checked test_core and test_implement (which covers these functions) on Windows 10 so I think we should be good.

@kennykerr kennykerr merged commit 24490bf into master Sep 4, 2025
28 checks passed
@kennykerr kennykerr deleted the combase branch September 4, 2025 19:07
will-j-wright added a commit to microsoft/openvmm that referenced this pull request Sep 8, 2025
For a closed-source change, we need the newest version of the windows
crates, specifically microsoft/windows-rs#3724
and microsoft/windows-rs#3743.
gurasinghMS pushed a commit to gurasinghMS/openvmm that referenced this pull request Sep 9, 2025
For a closed-source change, we need the newest version of the windows
crates, specifically microsoft/windows-rs#3724
and microsoft/windows-rs#3743.
@roblabla
Copy link
Contributor

This broke Windows 7 support, which doesn't have combase.dll. Would it be possible to reintroduce the ole32.dll when building for the win7 target?

@riverar
Copy link
Collaborator

riverar commented Oct 15, 2025

Hey @roblabla, we don't see sufficient value in adding additional complexity here to support Windows 7 at this time. (Sorry!)

Perhaps you can include a small forwarder with your target?

lib.rs:

macro_rules! stub {
    ($name:ident) => {
        #[allow(non_snake_case)]
        #[unsafe(export_name = stringify!($name))]
        pub extern "C" fn $name() {
            unreachable!()
        }
    };
    ($($name:ident),+ $(,)?) => {
        $(stub!($name);)+
    };
}

stub!(
    CoCreateFreeThreadedMarshaler,
    CoIncrementMTAUsage,
    CoTaskMemAlloc,
    CoTaskMemFree,
    RoGetAgileReference,
);

build.rs:

fn main() {
  println!("cargo::rustc-link-arg=/DEF:module.def");
}

module.def:

EXPORTS
    CoCreateFreeThreadedMarshaler=OLE32.CoCreateFreeThreadedMarshaler @865
    CoIncrementMTAUsage=OLE32.CoIncrementMTAUsage @919
    CoTaskMemAlloc=OLE32.CoTaskMemAlloc @963
    CoTaskMemFree=OLE32.CoTaskMemFree @964
    RoGetAgileReference=OLE32.RoGetAgileReference @1236

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants