OLD | NEW |
(Empty) | |
| 1 /** |
| 2 * \file COM_Value.h Support for the values used in COM and Automation. |
| 3 */ |
| 4 #ifndef COM_VALUE_H |
| 5 #define COM_VALUE_H |
| 6 |
| 7 #include <wtypes.h> |
| 8 #include <string> |
| 9 |
| 10 namespace AdblockPlus |
| 11 { |
| 12 namespace COM |
| 13 { |
| 14 /** |
| 15 * BSTR life cycle manager. Used by a caller to pass BSTR as an argument to
a COM call. |
| 16 * |
| 17 * This class manages the life cycle of a BSTR passed as an argument to a CO
M call. |
| 18 * There are two different life cycles relevant here. |
| 19 * In the first, the BSTR acts as an ordinary argument; in the second, the B
STR is a return value. |
| 20 * Both these are implemented as arguments to a COM function; |
| 21 * the difference is that one is an [in] param and the other is an [out]. |
| 22 * In both cases, we must release an allocated string, whether or not we all
ocated it. |
| 23 * Because of this commonality, it's possible to combine these two uses into
a single class. |
| 24 * |
| 25 * The two life cycles differ in how the allocation is done. |
| 26 * When used as an argument, the caller must allocate. |
| 27 * In this case the caller uses the non-trivial constructor, which allocates
a copy of its argument. |
| 28 * When used for a result, the called function allocates. |
| 29 * In this case the caller uses the default constructor and the address-of o
perator; |
| 30 * the address-of operator does not allocate and its pointer must be assig
ned an allocated value. |
| 31 * |
| 32 * Copy/move constructor/assignment are all deleted, not because they couldn
't be implemented, |
| 33 * but because these class are meant to be used in tight conjunction with
API calls. |
| 34 * Thus their design use requires that they not leave this proximity. |
| 35 * |
| 36 * \par Reference |
| 37 * MSDN "Allocating and Releasing Memory for a BSTR" http://msdn.microsoft
.com/en-us/library/vstudio/xda6xzx7%28v=vs.120%29.aspx |
| 38 * "When you call into a function that expects a BSTR argument, you must a
llocate the memory for the BSTR before the call and release it afterwards." |
| 39 * "When you call into a function that returns a BSTR, you must free the s
tring yourself." |
| 40 * |
| 41 * \invariant Either bstr == nullptr or bstr is a non-null system-allocated
BSTR. |
| 42 */ |
| 43 class BSTR_Argument |
| 44 { |
| 45 /** |
| 46 * The underlying BSTR pointer. |
| 47 */ |
| 48 BSTR bstr; |
| 49 |
| 50 public: |
| 51 /** |
| 52 * Default constructor has the value of the empty string. |
| 53 */ |
| 54 BSTR_Argument() |
| 55 : bstr(nullptr) |
| 56 { |
| 57 } |
| 58 |
| 59 /** |
| 60 * Constructor from std::wstring. |
| 61 */ |
| 62 BSTR_Argument(const std::wstring& s); |
| 63 |
| 64 /** |
| 65 * Destructor |
| 66 * |
| 67 * The destructor frees the BSTR. |
| 68 * Do not use this class when freeing the BSTR is not our responsibility. |
| 69 */ |
| 70 ~BSTR_Argument(); |
| 71 |
| 72 /** |
| 73 * Conversion operator to BSTR. |
| 74 */ |
| 75 operator BSTR() const |
| 76 { |
| 77 return bstr; |
| 78 } |
| 79 |
| 80 /** |
| 81 * Conversion operator to std::wstring |
| 82 */ |
| 83 operator std::wstring() const; |
| 84 |
| 85 /** |
| 86 * Address-of operator. |
| 87 * |
| 88 * This operator is used for assignment directly into our underlying point
er. |
| 89 * In order to avoid leaking memory, this operator also implicitly assigns
the null string. |
| 90 * Specifically, this operator is not 'const'. |
| 91 * |
| 92 * \par postcondition |
| 93 * - bstr == nullptr |
| 94 * - return value is not null |
| 95 * - does not throw |
| 96 */ |
| 97 BSTR* operator&(); // noexcept |
| 98 |
| 99 private: |
| 100 /** |
| 101 * Copy constructor is deleted |
| 102 */ |
| 103 BSTR_Argument(const BSTR_Argument&); // = delete |
| 104 |
| 105 /** |
| 106 * Move constructor is deleted |
| 107 */ |
| 108 BSTR_Argument(BSTR_Argument&&); // = delete |
| 109 |
| 110 /** |
| 111 * Copy assignment is deleted |
| 112 */ |
| 113 BSTR_Argument& operator=(const BSTR_Argument&); // = delete |
| 114 |
| 115 /** |
| 116 * Move assignment is deleted |
| 117 */ |
| 118 BSTR_Argument& operator=(BSTR_Argument&&); // = delete |
| 119 }; |
| 120 } |
| 121 } |
| 122 |
| 123 #endif |
OLD | NEW |