Created
August 18, 2023 17:26
-
-
Save kennykerr/982c724521ae0dd0bc44ed6944c059e2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#![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