6个版本
0.2.0 | 2023年7月25日 |
---|---|
0.1.1 | 2019年3月1日 |
0.1.0 | 2019年3月1日 |
0.1.0-alpha3 | 2018年11月11日 |
在#com-interface中排名第18
每月下载量138次
在4个crate中使用(其中2个直接使用)
37KB
826 行
实现具有自动引用计数的COM对象结构体,并为您实现IUnknown。这涵盖了从Rust创建COM对象的最常见用例。支持泛型参数!
#[macro_use]
extern crate derive_com_impl;
extern crate com_impl;
extern crate winapi;
extern crate wio;
use com_impl::{VTable, Refcount};
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(ComImpl)]
#[interfaces(IDWriteFontFileStream)]
pub struct FileStream {
vtbl: VTable<IDWriteFontFileStreamVtbl>,
refcount: 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]
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
}
依赖项
~2MB
~46K SLoC