1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//! Implements a COM Object struct with automatic reference counting and implements
//! IUnknown for you. This covers the most common use cases of creating COM objects
//! from Rust. Supports generic parameters!
//!
//! ```
//! use winapi::ctypes::c_void;
//! use winapi::shared::winerror::{ERROR_INVALID_INDEX, HRESULT, HRESULT_FROM_WIN32, S_OK};
//! use winapi::um::dwrite::{IDWriteFontFileStream, IDWriteFontFileStreamVtbl};
//! use wio::com::ComPtr;
//!
//! #[repr(C)]
//! #[derive(com_impl::ComImpl)]
//! #[interfaces(IDWriteFontFileStream)]
//! pub struct FileStream {
//! vtbl: com_impl::VTable<IDWriteFontFileStreamVtbl>,
//! refcount: com_impl::Refcount,
//! write_time: u64,
//! file_data: Vec<u8>,
//! }
//!
//! impl FileStream {
//! pub fn new(write_time: u64, data: Vec<u8>) -> ComPtr<IDWriteFontFileStream> {
//! let ptr = FileStream::create_raw(write_time, data);
//! let ptr = ptr as *mut IDWriteFontFileStream;
//! unsafe { ComPtr::from_raw(ptr) }
//! }
//! }
//!
//! #[com_impl::com_impl]
//! unsafe impl IDWriteFontFileStream for FileStream {
//! unsafe fn get_file_size(&self, size: *mut u64) -> HRESULT {
//! *size = self.file_data.len() as u64;
//! S_OK
//! }
//!
//! unsafe fn get_last_write_time(&self, write_time: *mut u64) -> HRESULT {
//! *write_time = self.write_time;
//! S_OK
//! }
//!
//! unsafe fn read_file_fragment(
//! &self,
//! start: *mut *const c_void,
//! offset: u64,
//! size: u64,
//! ctx: *mut *mut c_void,
//! ) -> HRESULT {
//! if offset > std::isize::MAX as u64 || size > std::isize::MAX as u64 {
//! return HRESULT_FROM_WIN32(ERROR_INVALID_INDEX);
//! }
//!
//! let offset = offset as usize;
//! let size = size as usize;
//!
//! if offset + size > self.file_data.len() {
//! return HRESULT_FROM_WIN32(ERROR_INVALID_INDEX);
//! }
//!
//! *start = self.file_data.as_ptr().offset(offset as isize) as *const c_void;
//! *ctx = std::ptr::null_mut();
//!
//! S_OK
//! }
//!
//! unsafe fn release_file_fragment(&self, _ctx: *mut c_void) {
//! // Nothing to do
//! }
//! }
//!
//! fn main() {
//! let ptr = FileStream::new(100, vec![0xDE, 0xAF, 0x00, 0xF0, 0x01]);
//!
//! // Do things with ptr
//! }
//! ```
extern crate derive_com_impl;
extern crate winapi;
use ;
pub use ;
/// Wrapper for the C++ VTable member of a COM object.
///
/// When you're using `#[derive(ComImpl)]`, this should be the first member of your struct.
/// Trait that allows accessing the VTable for all of the COM interfaces your object
/// implements.
pub unsafe
/// Refcounter object for automatic COM Object implementations. Atomically keeps track of
/// the reference count so that the implementation of IUnknown can properly deallocate
/// the object when all reference counts are gone.