Skip to content

Instantly share code, notes, and snippets.

@kennykerr
Created August 18, 2023 17:26
Show Gist options
  • Save kennykerr/982c724521ae0dd0bc44ed6944c059e2 to your computer and use it in GitHub Desktop.
Save kennykerr/982c724521ae0dd0bc44ed6944c059e2 to your computer and use it in GitHub Desktop.
#![allow(non_snake_case)]
use windows::{core::*, Win32::Foundation::*};
#[interface("17f409a1-f79d-45f6-962d-9db106cb7727")]
unsafe trait ICompositor: IUnknown {
unsafe fn CreateVisual(&self, value: u32, visual: *mut Option<IVisual>) -> HRESULT;
unsafe fn RenderVisual(&self, visual: std::mem::ManuallyDrop<Option<IVisual>>) -> HRESULT;
}
#[interface("34e49797-1302-4ad6-8975-dd7c5b286e72")]
unsafe trait IVisual: IUnknown {
unsafe fn GetValue(&self, value: *mut u32) -> HRESULT;
}
#[implement(ICompositor)]
struct Compositor;
impl ICompositor_Impl for Compositor {
unsafe fn CreateVisual(&self, value: u32, result: *mut Option<IVisual>) -> HRESULT {
*result = Some(Visual(value).into());
S_OK
}
unsafe fn RenderVisual(&self, visual: std::mem::ManuallyDrop<Option<IVisual>>) -> HRESULT {
if let Some(visual) = &*visual {
let mut value = 0;
_ = visual.GetValue(&mut value);
println!("value: {}", value);
S_OK
} else {
E_FAIL
}
}
}
#[implement(IVisual)]
struct Visual(u32);
impl IVisual_Impl for Visual {
unsafe fn GetValue(&self, value: *mut u32) -> HRESULT {
*value = self.0;
S_OK
}
}
fn main() -> Result<()> {
unsafe {
let compositor: ICompositor = Compositor.into();
let mut visual = None;
compositor.CreateVisual(123, &mut visual).ok()?;
compositor
.RenderVisual(std::mem::transmute_copy(&visual))
.ok()?;
Ok(())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment