winsafe\ole\com_interfaces/
idataobject.rs

1#![allow(non_camel_case_types, non_snake_case)]
2
3use crate::co;
4use crate::decl::*;
5use crate::guard::*;
6use crate::kernel::privs::*;
7use crate::ole::{privs::*, vts::*};
8use crate::prelude::*;
9
10com_interface! { IDataObject: "0000010e-0000-0000-c000-000000000046";
11	/// [`IDataObject`](https://learn.microsoft.com/en-us/windows/win32/api/objidl/nn-objidl-idataobject)
12	/// COM interface.
13	///
14	/// Automatically calls
15	/// [`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
19impl ole_IDataObject for IDataObject {}
20
21/// This trait is enabled with the `ole` feature, and provides methods for
22/// [`IDataObject`](crate::IDataObject).
23///
24/// Prefer importing this trait through the prelude:
25///
26/// ```no_run
27/// use winsafe::prelude::*;
28/// ```
29pub trait ole_IDataObject: ole_IUnknown {
30	/// [`IDataObject::DAdvise`](https://learn.microsoft.com/en-us/windows/win32/api/objidl/nf-objidl-idataobject-dadvise)
31	/// method.
32	fn DAdvise(
33		&self,
34		formatetc: &FORMATETC,
35		advf: co::ADVF,
36		adv_sink: &impl ole_IAdviseSink,
37	) -> HrResult<u32> {
38		let mut connection = u32::default();
39		ok_to_hrresult(unsafe {
40			(vt::<IDataObjectVT>(self).DAdvise)(
41				self.ptr(),
42				pcvoid(formatetc),
43				advf.raw(),
44				adv_sink.ptr(),
45				&mut connection,
46			)
47		})
48		.map(|_| connection)
49	}
50
51	/// [`IDataObject::DUnadvise`](https://learn.microsoft.com/en-us/windows/win32/api/objidl/nf-objidl-idataobject-dunadvise)
52	/// method.
53	fn DUnadvise(&self, connection: u32) -> HrResult<()> {
54		ok_to_hrresult(unsafe { (vt::<IDataObjectVT>(self).DUnadvise)(self.ptr(), connection) })
55	}
56
57	/// [`IDataObject::GetData`](https://learn.microsoft.com/en-us/windows/win32/api/objidl/nf-objidl-idataobject-getdata)
58	/// method.
59	///
60	/// # Safety
61	///
62	/// The returned struct may contain pointers that need to be deallocated.
63	unsafe fn GetData(&self, formatetc: &FORMATETC) -> HrResult<ReleaseStgMediumGuard> {
64		let mut sm = STGMEDIUM::default();
65		ok_to_hrresult((vt::<IDataObjectVT>(self).GetData)(
66			self.ptr(),
67			pcvoid(formatetc),
68			pvoid(&mut sm),
69		))
70		.map(|_| ReleaseStgMediumGuard::new(sm))
71	}
72
73	/// [`IDataObject::QueryGetData`](https://learn.microsoft.com/en-us/windows/win32/api/objidl/nf-objidl-idataobject-querygetdata)
74	/// method.
75	fn QueryGetData(&self, formatetc: &FORMATETC) -> HrResult<()> {
76		ok_to_hrresult(unsafe {
77			(vt::<IDataObjectVT>(self).QueryGetData)(self.ptr(), pcvoid(formatetc))
78		})
79	}
80}