winsafe\mf\com_interfaces/imfgetservice.rs
1#![allow(non_camel_case_types, non_snake_case)]
2
3use crate::co;
4use crate::decl::*;
5use crate::kernel::privs::*;
6use crate::mf::vts::*;
7use crate::ole::privs::*;
8use crate::prelude::*;
9
10com_interface! { IMFGetService: "fa993888-4383-415a-a930-dd472a8cf6f7";
11 /// [`IMFGetService`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nn-mfidl-imfgetservice)
12 /// COM interface.
13 ///
14 /// Automatically calls
15 /// [`IUnknown::Release`](https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-release)
16 /// when the object goes out of scope.
17 ///
18 /// # Examples
19 ///
20 /// ```no_run
21 /// use winsafe::{self as w, prelude::*};
22 ///
23 /// let vmr: w::IBaseFilter; // initialized somewhere
24 /// # let vmr = unsafe { w::IBaseFilter::null() };
25 ///
26 /// let get_svc = vmr.QueryInterface::<w::IMFGetService>()?;
27 /// # w::HrResult::Ok(())
28 /// ```
29}
30
31impl mf_IMFGetService for IMFGetService {}
32
33/// This trait is enabled with the `mf` feature, and provides methods for
34/// [`IMFGetService`](crate::IMFGetService).
35///
36/// Prefer importing this trait through the prelude:
37///
38/// ```no_run
39/// use winsafe::prelude::*;
40/// ```
41pub trait mf_IMFGetService: ole_IUnknown {
42 /// [`IMFGetService::GetService`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfgetservice-getservice)
43 /// method.
44 ///
45 /// # Examples
46 ///
47 /// ```no_run
48 /// use winsafe::{self as w, prelude::*, co};
49 ///
50 /// let get_svc: w::IMFGetService; // initialized somewhere
51 /// # let get_svc = unsafe { w::IMFGetService::null() };
52 ///
53 /// let controller_evr = get_svc
54 /// .GetService::<w::IMFVideoDisplayControl>(
55 /// &co::MF_SERVICE::MR_VIDEO_RENDER_SERVICE,
56 /// )?;
57 /// # w::HrResult::Ok(())
58 /// ```
59 #[must_use]
60 fn GetService<T>(&self, service_id: &co::MF_SERVICE) -> HrResult<T>
61 where
62 T: ole_IUnknown,
63 {
64 let mut queried = unsafe { T::null() };
65 HrRet(unsafe {
66 (vt::<IMFGetServiceVT>(self).GetService)(
67 self.ptr(),
68 pcvoid(service_id),
69 pcvoid(&T::IID),
70 queried.as_mut(),
71 )
72 })
73 .to_hrresult()
74 .map(|_| queried)
75 }
76}