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
//! A helper crate for consuming and producing COM interfaces.

//!

//! # Example

//!

//! To work with a COM interface it must first be declared:

//!

//! ```rust,no_run

//! /// Define an IAnimal interface

//! com::interfaces! {

//!     #[uuid("EFF8970E-C50F-45E0-9284-291CE5A6F771")]

//!     pub unsafe interface IAnimal: com::interfaces::IUnknown {

//!         unsafe fn Eat(&self) -> com::sys::HRESULT;

//!     }

//! }

//! # fn main() {}

//! ```

//!

//!  To define a COM implementation class:

//!

//! ```rust,no_run

//! # com::interfaces! {

//! #     #[uuid("EFF8970E-C50F-45E0-9284-291CE5A6F771")]

//! #     pub unsafe interface IAnimal: com::interfaces::IUnknown {

//! #         unsafe fn Eat(&self) -> com::sys::HRESULT;

//! #     }

//! # }

//! com::class! {

//!     pub class BritishShortHairCat: IAnimal {

//!         num_owners: u32,

//!     }

//!     

//!     impl IAnimal for BritishShortHairCat {

//!         fn Eat(&self) -> com::sys::HRESULT {

//!             println!("Eating...");

//!             com::sys::NOERROR

//!         }

//!     }

//! }

//! # fn main() {}

//! ```

//!

//! See the examples directory in the repository for more examples.

//!


#![deny(missing_docs)]

mod abi_transferable;
mod interface;
pub mod interfaces;
mod param;
#[cfg(windows)]
pub mod runtime;
pub mod sys;

#[cfg(feature = "production")]
/// Functionality for producing COM classes

pub mod production;

#[doc(inline)]
pub use abi_transferable::AbiTransferable;
#[doc(inline)]
pub use interface::Interface;
#[doc(inline)]
pub use param::Param;
#[doc(inline)]
pub use sys::{CLSID, IID};

/// Declare COM interfaces

///

/// # Example

/// ```rust,no_run

/// /// Define an IAnimal interface

/// com::interfaces! {

///     #[uuid("EFF8970E-C50F-45E0-9284-291CE5A6F771")]

///     pub unsafe interface IAnimal: com::interfaces::IUnknown {

///         unsafe fn Eat(&self) -> com::sys::HRESULT;

///     }

/// }

/// # fn main() {}

/// ```

pub use com_macros::interfaces;

/// Declare COM implementation classes

///

/// # Example

/// ```rust,no_run

/// use com::sys::{HRESULT, NOERROR};

/// # com::interfaces! {

/// #     #[uuid("EFF8970E-C50F-45E0-9284-291CE5A6F771")]

/// #     pub unsafe interface IAnimal: com::interfaces::IUnknown {

/// #         unsafe fn Eat(&self) -> com::sys::HRESULT;

/// #     }

/// # }

///

/// com::class! {

///     pub class BritishShortHairCat: IAnimal {

///         num_owners: u32,

///     }

///     

///     impl IAnimal for BritishShortHairCat {

///         fn Eat(&self) -> HRESULT {

///             println!("Eating...");

///             NOERROR

///         }

///     }

/// }

/// # fn main() {}

/// ```

#[cfg(feature = "production")]
pub use com_macros::class;

// this allows for the crate to refer to itself as `com` to keep macros consistent

// whether they are used by some other crate or internally

#[doc(hidden)]
extern crate self as com;