diff options
| author | Rob Mensching <rob@firegiant.com> | 2017-10-14 16:12:07 -0700 |
|---|---|---|
| committer | Rob Mensching <rob@firegiant.com> | 2017-10-14 16:12:07 -0700 |
| commit | dbde9e7104b907bbbaea17e21247d8cafc8b3a4c (patch) | |
| tree | 0f5fbbb6fe12c6b2e5e622a0e18ce4c5b4eb2b96 /src/WixToolset.Core.WindowsInstaller/Ole32 | |
| parent | fbf986eb97f68396797a89fc7d40dec07b775440 (diff) | |
| download | wix-dbde9e7104b907bbbaea17e21247d8cafc8b3a4c.tar.gz wix-dbde9e7104b907bbbaea17e21247d8cafc8b3a4c.tar.bz2 wix-dbde9e7104b907bbbaea17e21247d8cafc8b3a4c.zip | |
Massive refactoring to introduce the concept of IBackend
Diffstat (limited to 'src/WixToolset.Core.WindowsInstaller/Ole32')
| -rw-r--r-- | src/WixToolset.Core.WindowsInstaller/Ole32/Storage.cs | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Ole32/Storage.cs b/src/WixToolset.Core.WindowsInstaller/Ole32/Storage.cs new file mode 100644 index 00000000..c6a43bc4 --- /dev/null +++ b/src/WixToolset.Core.WindowsInstaller/Ole32/Storage.cs | |||
| @@ -0,0 +1,437 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Ole32 | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using System.Runtime.InteropServices; | ||
| 7 | using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME; | ||
| 8 | using STATSTG = System.Runtime.InteropServices.ComTypes.STATSTG; | ||
| 9 | |||
| 10 | /// <summary> | ||
| 11 | /// Specifies the access mode to use when opening, creating, or deleting a storage object. | ||
| 12 | /// </summary> | ||
| 13 | internal enum StorageMode | ||
| 14 | { | ||
| 15 | /// <summary> | ||
| 16 | /// Indicates that the object is read-only, meaning that modifications cannot be made. | ||
| 17 | /// </summary> | ||
| 18 | Read = 0x0, | ||
| 19 | |||
| 20 | /// <summary> | ||
| 21 | /// Enables you to save changes to the object, but does not permit access to its data. | ||
| 22 | /// </summary> | ||
| 23 | Write = 0x1, | ||
| 24 | |||
| 25 | /// <summary> | ||
| 26 | /// Enables access and modification of object data. | ||
| 27 | /// </summary> | ||
| 28 | ReadWrite = 0x2, | ||
| 29 | |||
| 30 | /// <summary> | ||
| 31 | /// Specifies that subsequent openings of the object are not denied read or write access. | ||
| 32 | /// </summary> | ||
| 33 | ShareDenyNone = 0x40, | ||
| 34 | |||
| 35 | /// <summary> | ||
| 36 | /// Prevents others from subsequently opening the object in Read mode. | ||
| 37 | /// </summary> | ||
| 38 | ShareDenyRead = 0x30, | ||
| 39 | |||
| 40 | /// <summary> | ||
| 41 | /// Prevents others from subsequently opening the object for Write or ReadWrite access. | ||
| 42 | /// </summary> | ||
| 43 | ShareDenyWrite = 0x20, | ||
| 44 | |||
| 45 | /// <summary> | ||
| 46 | /// Prevents others from subsequently opening the object in any mode. | ||
| 47 | /// </summary> | ||
| 48 | ShareExclusive = 0x10, | ||
| 49 | |||
| 50 | /// <summary> | ||
| 51 | /// Opens the storage object with exclusive access to the most recently committed version. | ||
| 52 | /// </summary> | ||
| 53 | Priority = 0x40000, | ||
| 54 | |||
| 55 | /// <summary> | ||
| 56 | /// Indicates that an existing storage object or stream should be removed before the new object replaces it. | ||
| 57 | /// </summary> | ||
| 58 | Create = 0x1000, | ||
| 59 | } | ||
| 60 | |||
| 61 | /// <summary> | ||
| 62 | /// Wrapper for the compound storage file APIs. | ||
| 63 | /// </summary> | ||
| 64 | internal sealed class Storage : IDisposable | ||
| 65 | { | ||
| 66 | private bool disposed; | ||
| 67 | private IStorage storage; | ||
| 68 | |||
| 69 | /// <summary> | ||
| 70 | /// Instantiate a new Storage. | ||
| 71 | /// </summary> | ||
| 72 | /// <param name="storage">The native storage interface.</param> | ||
| 73 | private Storage(IStorage storage) | ||
| 74 | { | ||
| 75 | this.storage = storage; | ||
| 76 | } | ||
| 77 | |||
| 78 | /// <summary> | ||
| 79 | /// Storage destructor. | ||
| 80 | /// </summary> | ||
| 81 | ~Storage() | ||
| 82 | { | ||
| 83 | this.Dispose(); | ||
| 84 | } | ||
| 85 | |||
| 86 | /// <summary> | ||
| 87 | /// The IEnumSTATSTG interface enumerates an array of STATSTG structures. | ||
| 88 | /// </summary> | ||
| 89 | [ComImport, Guid("0000000d-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
| 90 | public interface IEnumSTATSTG | ||
| 91 | { | ||
| 92 | /// <summary> | ||
| 93 | /// Gets a specified number of STATSTG structures. | ||
| 94 | /// </summary> | ||
| 95 | /// <param name="celt">The number of STATSTG structures requested.</param> | ||
| 96 | /// <param name="rgelt">An array of STATSTG structures returned.</param> | ||
| 97 | /// <param name="pceltFetched">The number of STATSTG structures retrieved in the rgelt parameter.</param> | ||
| 98 | /// <returns>The error code.</returns> | ||
| 99 | [PreserveSig] | ||
| 100 | uint Next(uint celt, [MarshalAs(UnmanagedType.LPArray), Out] STATSTG[] rgelt, out uint pceltFetched); | ||
| 101 | |||
| 102 | /// <summary> | ||
| 103 | /// Skips a specified number of STATSTG structures in the enumeration sequence. | ||
| 104 | /// </summary> | ||
| 105 | /// <param name="celt">The number of STATSTG structures to skip.</param> | ||
| 106 | void Skip(uint celt); | ||
| 107 | |||
| 108 | /// <summary> | ||
| 109 | /// Resets the enumeration sequence to the beginning of the STATSTG structure array. | ||
| 110 | /// </summary> | ||
| 111 | void Reset(); | ||
| 112 | |||
| 113 | /// <summary> | ||
| 114 | /// Creates a new enumerator that contains the same enumeration state as the current STATSTG structure enumerator. | ||
| 115 | /// </summary> | ||
| 116 | /// <returns>The cloned IEnumSTATSTG interface.</returns> | ||
| 117 | [return: MarshalAs(UnmanagedType.Interface)] | ||
| 118 | IEnumSTATSTG Clone(); | ||
| 119 | } | ||
| 120 | |||
| 121 | /// <summary> | ||
| 122 | /// The IStorage interface supports the creation and management of structured storage objects. | ||
| 123 | /// </summary> | ||
| 124 | [ComImport, Guid("0000000b-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
| 125 | private interface IStorage | ||
| 126 | { | ||
| 127 | /// <summary> | ||
| 128 | /// Creates and opens a stream object with the specified name contained in this storage object. | ||
| 129 | /// </summary> | ||
| 130 | /// <param name="pwcsName">The name of the newly created stream.</param> | ||
| 131 | /// <param name="grfMode">Specifies the access mode to use when opening the newly created stream.</param> | ||
| 132 | /// <param name="reserved1">Reserved for future use; must be zero.</param> | ||
| 133 | /// <param name="reserved2">Reserved for future use; must be zero.</param> | ||
| 134 | /// <param name="ppstm">On return, pointer to the location of the new IStream interface pointer.</param> | ||
| 135 | void CreateStream(string pwcsName, uint grfMode, uint reserved1, uint reserved2, out IStream ppstm); | ||
| 136 | |||
| 137 | /// <summary> | ||
| 138 | /// Opens an existing stream object within this storage object using the specified access permissions in grfMode. | ||
| 139 | /// </summary> | ||
| 140 | /// <param name="pwcsName">The name of the stream to open.</param> | ||
| 141 | /// <param name="reserved1">Reserved for future use; must be NULL.</param> | ||
| 142 | /// <param name="grfMode">Specifies the access mode to be assigned to the open stream.</param> | ||
| 143 | /// <param name="reserved2">Reserved for future use; must be zero.</param> | ||
| 144 | /// <param name="ppstm">A pointer to IStream pointer variable that receives the interface pointer to the newly opened stream object.</param> | ||
| 145 | void OpenStream(string pwcsName, IntPtr reserved1, uint grfMode, uint reserved2, out IStream ppstm); | ||
| 146 | |||
| 147 | /// <summary> | ||
| 148 | /// Creates and opens a new storage object nested within this storage object with the specified name in the specified access mode. | ||
| 149 | /// </summary> | ||
| 150 | /// <param name="pwcsName">The name of the newly created storage object.</param> | ||
| 151 | /// <param name="grfMode">A value that specifies the access mode to use when opening the newly created storage object.</param> | ||
| 152 | /// <param name="reserved1">Reserved for future use; must be zero.</param> | ||
| 153 | /// <param name="reserved2">Reserved for future use; must be zero.</param> | ||
| 154 | /// <param name="ppstg">A pointer, when successful, to the location of the IStorage pointer to the newly created storage object.</param> | ||
| 155 | void CreateStorage(string pwcsName, uint grfMode, uint reserved1, uint reserved2, out IStorage ppstg); | ||
| 156 | |||
| 157 | /// <summary> | ||
| 158 | /// Opens an existing storage object with the specified name in the specified access mode. | ||
| 159 | /// </summary> | ||
| 160 | /// <param name="pwcsName">The name of the storage object to open.</param> | ||
| 161 | /// <param name="pstgPriority">Must be NULL.</param> | ||
| 162 | /// <param name="grfMode">Specifies the access mode to use when opening the storage object.</param> | ||
| 163 | /// <param name="snbExclude">Must be NULL.</param> | ||
| 164 | /// <param name="reserved">Reserved for future use; must be zero.</param> | ||
| 165 | /// <param name="ppstg">When successful, pointer to the location of an IStorage pointer to the opened storage object.</param> | ||
| 166 | void OpenStorage(string pwcsName, IStorage pstgPriority, uint grfMode, IntPtr snbExclude, uint reserved, out IStorage ppstg); | ||
| 167 | |||
| 168 | /// <summary> | ||
| 169 | /// Copies the entire contents of an open storage object to another storage object. | ||
| 170 | /// </summary> | ||
| 171 | /// <param name="ciidExclude">The number of elements in the array pointed to by rgiidExclude.</param> | ||
| 172 | /// <param name="rgiidExclude">An array of interface identifiers (IIDs) that either the caller knows about and does not want | ||
| 173 | /// copied or that the storage object does not support, but whose state the caller will later explicitly copy.</param> | ||
| 174 | /// <param name="snbExclude">A string name block (refer to SNB) that specifies a block of storage or stream objects that are not to be copied to the destination.</param> | ||
| 175 | /// <param name="pstgDest">A pointer to the open storage object into which this storage object is to be copied.</param> | ||
| 176 | void CopyTo(uint ciidExclude, IntPtr rgiidExclude, IntPtr snbExclude, IStorage pstgDest); | ||
| 177 | |||
| 178 | /// <summary> | ||
| 179 | /// Copies or moves a substorage or stream from this storage object to another storage object. | ||
| 180 | /// </summary> | ||
| 181 | /// <param name="pwcsName">The name of the element in this storage object to be moved or copied.</param> | ||
| 182 | /// <param name="pstgDest">IStorage pointer to the destination storage object.</param> | ||
| 183 | /// <param name="pwcsNewName">The new name for the element in its new storage object.</param> | ||
| 184 | /// <param name="grfFlags">Specifies whether the operation should be a move (STGMOVE_MOVE) or a copy (STGMOVE_COPY).</param> | ||
| 185 | void MoveElementTo(string pwcsName, IStorage pstgDest, string pwcsNewName, uint grfFlags); | ||
| 186 | |||
| 187 | /// <summary> | ||
| 188 | /// Reflects changes for a transacted storage object to the parent level. | ||
| 189 | /// </summary> | ||
| 190 | /// <param name="grfCommitFlags">Controls how the changes are committed to the storage object.</param> | ||
| 191 | void Commit(uint grfCommitFlags); | ||
| 192 | |||
| 193 | /// <summary> | ||
| 194 | /// Discards all changes that have been made to the storage object since the last commit operation. | ||
| 195 | /// </summary> | ||
| 196 | void Revert(); | ||
| 197 | |||
| 198 | /// <summary> | ||
| 199 | /// Returns an enumerator object that can be used to enumerate the storage and stream objects contained within this storage object. | ||
| 200 | /// </summary> | ||
| 201 | /// <param name="reserved1">Reserved for future use; must be zero.</param> | ||
| 202 | /// <param name="reserved2">Reserved for future use; must be NULL.</param> | ||
| 203 | /// <param name="reserved3">Reserved for future use; must be zero.</param> | ||
| 204 | /// <param name="ppenum">Pointer to IEnumSTATSTG* pointer variable that receives the interface pointer to the new enumerator object.</param> | ||
| 205 | void EnumElements(uint reserved1, IntPtr reserved2, uint reserved3, out IEnumSTATSTG ppenum); | ||
| 206 | |||
| 207 | /// <summary> | ||
| 208 | /// Removes the specified storage or stream from this storage object. | ||
| 209 | /// </summary> | ||
| 210 | /// <param name="pwcsName">The name of the storage or stream to be removed.</param> | ||
| 211 | void DestroyElement(string pwcsName); | ||
| 212 | |||
| 213 | /// <summary> | ||
| 214 | /// Renames the specified storage or stream in this storage object. | ||
| 215 | /// </summary> | ||
| 216 | /// <param name="pwcsOldName">The name of the substorage or stream to be changed.</param> | ||
| 217 | /// <param name="pwcsNewName">The new name for the specified substorage or stream.</param> | ||
| 218 | void RenameElement(string pwcsOldName, string pwcsNewName); | ||
| 219 | |||
| 220 | /// <summary> | ||
| 221 | /// Sets the modification, access, and creation times of the indicated storage element, if supported by the underlying file system. | ||
| 222 | /// </summary> | ||
| 223 | /// <param name="pwcsName">The name of the storage object element whose times are to be modified.</param> | ||
| 224 | /// <param name="pctime">Either the new creation time for the element or NULL if the creation time is not to be modified.</param> | ||
| 225 | /// <param name="patime">Either the new access time for the element or NULL if the access time is not to be modified.</param> | ||
| 226 | /// <param name="pmtime">Either the new modification time for the element or NULL if the modification time is not to be modified.</param> | ||
| 227 | void SetElementTimes(string pwcsName, FILETIME pctime, FILETIME patime, FILETIME pmtime); | ||
| 228 | |||
| 229 | /// <summary> | ||
| 230 | /// Assigns the specified CLSID to this storage object. | ||
| 231 | /// </summary> | ||
| 232 | /// <param name="clsid">The CLSID that is to be associated with the storage object.</param> | ||
| 233 | void SetClass(Guid clsid); | ||
| 234 | |||
| 235 | /// <summary> | ||
| 236 | /// Stores up to 32 bits of state information in this storage object. | ||
| 237 | /// </summary> | ||
| 238 | /// <param name="grfStateBits">Specifies the new values of the bits to set.</param> | ||
| 239 | /// <param name="grfMask">A binary mask indicating which bits in grfStateBits are significant in this call.</param> | ||
| 240 | void SetStateBits(uint grfStateBits, uint grfMask); | ||
| 241 | |||
| 242 | /// <summary> | ||
| 243 | /// Returns the STATSTG structure for this open storage object. | ||
| 244 | /// </summary> | ||
| 245 | /// <param name="pstatstg">On return, pointer to a STATSTG structure where this method places information about the open storage object.</param> | ||
| 246 | /// <param name="grfStatFlag">Specifies that some of the members in the STATSTG structure are not returned, thus saving a memory allocation operation.</param> | ||
| 247 | void Stat(out STATSTG pstatstg, uint grfStatFlag); | ||
| 248 | } | ||
| 249 | |||
| 250 | /// <summary> | ||
| 251 | /// The IStream interface lets you read and write data to stream objects. | ||
| 252 | /// </summary> | ||
| 253 | [ComImport, Guid("0000000c-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
| 254 | private interface IStream | ||
| 255 | { | ||
| 256 | /// <summary> | ||
| 257 | /// Reads a specified number of bytes from the stream object into memory starting at the current seek pointer. | ||
| 258 | /// </summary> | ||
| 259 | /// <param name="pv">A pointer to the buffer which the stream data is read into.</param> | ||
| 260 | /// <param name="cb">The number of bytes of data to read from the stream object.</param> | ||
| 261 | /// <param name="pcbRead">A pointer to a ULONG variable that receives the actual number of bytes read from the stream object.</param> | ||
| 262 | void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv, int cb, IntPtr pcbRead); | ||
| 263 | |||
| 264 | /// <summary> | ||
| 265 | /// Writes a specified number of bytes into the stream object starting at the current seek pointer. | ||
| 266 | /// </summary> | ||
| 267 | /// <param name="pv">A pointer to the buffer that contains the data that is to be written to the stream.</param> | ||
| 268 | /// <param name="cb">The number of bytes of data to attempt to write into the stream.</param> | ||
| 269 | /// <param name="pcbWritten">A pointer to a ULONG variable where this method writes the actual number of bytes written to the stream object.</param> | ||
| 270 | void Write([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv, int cb, IntPtr pcbWritten); | ||
| 271 | |||
| 272 | /// <summary> | ||
| 273 | /// Changes the seek pointer to a new location relative to the beginning of the stream, the end of the stream, or the current seek pointer. | ||
| 274 | /// </summary> | ||
| 275 | /// <param name="dlibMove">The displacement to be added to the location indicated by the dwOrigin parameter.</param> | ||
| 276 | /// <param name="dwOrigin">The origin for the displacement specified in dlibMove.</param> | ||
| 277 | /// <param name="plibNewPosition">A pointer to the location where this method writes the value of the new seek pointer from the beginning of the stream.</param> | ||
| 278 | void Seek(long dlibMove, int dwOrigin, IntPtr plibNewPosition); | ||
| 279 | |||
| 280 | /// <summary> | ||
| 281 | /// Changes the size of the stream object. | ||
| 282 | /// </summary> | ||
| 283 | /// <param name="libNewSize">Specifies the new size of the stream as a number of bytes.</param> | ||
| 284 | void SetSize(long libNewSize); | ||
| 285 | |||
| 286 | /// <summary> | ||
| 287 | /// Copies a specified number of bytes from the current seek pointer in the stream to the current seek pointer in another stream. | ||
| 288 | /// </summary> | ||
| 289 | /// <param name="pstm">A pointer to the destination stream.</param> | ||
| 290 | /// <param name="cb">The number of bytes to copy from the source stream.</param> | ||
| 291 | /// <param name="pcbRead">A pointer to the location where this method writes the actual number of bytes read from the source.</param> | ||
| 292 | /// <param name="pcbWritten">A pointer to the location where this method writes the actual number of bytes written to the destination.</param> | ||
| 293 | void CopyTo(IStream pstm, long cb, IntPtr pcbRead, IntPtr pcbWritten); | ||
| 294 | |||
| 295 | /// <summary> | ||
| 296 | /// Ensures that any changes made to a stream object open in transacted mode are reflected in the parent storage object. | ||
| 297 | /// </summary> | ||
| 298 | /// <param name="grfCommitFlags">Controls how the changes for the stream object are committed.</param> | ||
| 299 | void Commit(int grfCommitFlags); | ||
| 300 | |||
| 301 | /// <summary> | ||
| 302 | /// Discards all changes that have been made to a transacted stream since the last call to IStream::Commit. | ||
| 303 | /// </summary> | ||
| 304 | void Revert(); | ||
| 305 | |||
| 306 | /// <summary> | ||
| 307 | /// Restricts access to a specified range of bytes in the stream. | ||
| 308 | /// </summary> | ||
| 309 | /// <param name="libOffset">Integer that specifies the byte offset for the beginning of the range.</param> | ||
| 310 | /// <param name="cb">Integer that specifies the length of the range, in bytes, to be restricted.</param> | ||
| 311 | /// <param name="dwLockType">Specifies the restrictions being requested on accessing the range.</param> | ||
| 312 | void LockRegion(long libOffset, long cb, int dwLockType); | ||
| 313 | |||
| 314 | /// <summary> | ||
| 315 | /// Removes the access restriction on a range of bytes previously restricted with IStream::LockRegion. | ||
| 316 | /// </summary> | ||
| 317 | /// <param name="libOffset">Specifies the byte offset for the beginning of the range.</param> | ||
| 318 | /// <param name="cb">Specifies, in bytes, the length of the range to be restricted.</param> | ||
| 319 | /// <param name="dwLockType">Specifies the access restrictions previously placed on the range.</param> | ||
| 320 | void UnlockRegion(long libOffset, long cb, int dwLockType); | ||
| 321 | |||
| 322 | /// <summary> | ||
| 323 | /// Retrieves the STATSTG structure for this stream. | ||
| 324 | /// </summary> | ||
| 325 | /// <param name="pstatstg">Pointer to a STATSTG structure where this method places information about this stream object.</param> | ||
| 326 | /// <param name="grfStatFlag">Specifies that this method does not return some of the members in the STATSTG structure, thus saving a memory allocation operation.</param> | ||
| 327 | void Stat(out STATSTG pstatstg, int grfStatFlag); | ||
| 328 | |||
| 329 | /// <summary> | ||
| 330 | /// Creates a new stream object that references the same bytes as the original stream but provides a separate seek pointer to those bytes. | ||
| 331 | /// </summary> | ||
| 332 | /// <param name="ppstm">When successful, pointer to the location of an IStream pointer to the new stream object.</param> | ||
| 333 | void Clone(out IStream ppstm); | ||
| 334 | } | ||
| 335 | |||
| 336 | /// <summary> | ||
| 337 | /// Creates a new compound file storage object. | ||
| 338 | /// </summary> | ||
| 339 | /// <param name="storageFile">The compound file being created.</param> | ||
| 340 | /// <param name="mode">Specifies the access mode to use when opening the new storage object.</param> | ||
| 341 | /// <returns>The created Storage object.</returns> | ||
| 342 | public static Storage CreateDocFile(string storageFile, StorageMode mode) | ||
| 343 | { | ||
| 344 | IStorage storage = NativeMethods.StgCreateDocfile(storageFile, (uint)mode, 0); | ||
| 345 | |||
| 346 | return new Storage(storage); | ||
| 347 | } | ||
| 348 | |||
| 349 | /// <summary> | ||
| 350 | /// Opens an existing root storage object in the file system. | ||
| 351 | /// </summary> | ||
| 352 | /// <param name="storageFile">The file that contains the storage object to open.</param> | ||
| 353 | /// <param name="mode">Specifies the access mode to use to open the storage object.</param> | ||
| 354 | /// <returns>The created Storage object.</returns> | ||
| 355 | public static Storage Open(string storageFile, StorageMode mode) | ||
| 356 | { | ||
| 357 | IStorage storage = NativeMethods.StgOpenStorage(storageFile, IntPtr.Zero, (uint)mode, IntPtr.Zero, 0); | ||
| 358 | |||
| 359 | return new Storage(storage); | ||
| 360 | } | ||
| 361 | |||
| 362 | /// <summary> | ||
| 363 | /// Copies the entire contents of this open storage object into another Storage object. | ||
| 364 | /// </summary> | ||
| 365 | /// <param name="destinationStorage">The destination Storage object.</param> | ||
| 366 | public void CopyTo(Storage destinationStorage) | ||
| 367 | { | ||
| 368 | this.storage.CopyTo(0, IntPtr.Zero, IntPtr.Zero, destinationStorage.storage); | ||
| 369 | } | ||
| 370 | |||
| 371 | /// <summary> | ||
| 372 | /// Opens an existing Storage object with the specified name according to the specified access mode. | ||
| 373 | /// </summary> | ||
| 374 | /// <param name="name">The name of the Storage object.</param> | ||
| 375 | /// <returns>The opened Storage object.</returns> | ||
| 376 | public Storage OpenStorage(string name) | ||
| 377 | { | ||
| 378 | IStorage subStorage; | ||
| 379 | |||
| 380 | this.storage.OpenStorage(name, null, (uint)(StorageMode.Read | StorageMode.ShareExclusive), IntPtr.Zero, 0, out subStorage); | ||
| 381 | |||
| 382 | return new Storage(subStorage); | ||
| 383 | } | ||
| 384 | |||
| 385 | /// <summary> | ||
| 386 | /// Disposes the managed and unmanaged objects in this object. | ||
| 387 | /// </summary> | ||
| 388 | public void Dispose() | ||
| 389 | { | ||
| 390 | if (!this.disposed) | ||
| 391 | { | ||
| 392 | Marshal.ReleaseComObject(this.storage); | ||
| 393 | |||
| 394 | this.disposed = true; | ||
| 395 | } | ||
| 396 | |||
| 397 | GC.SuppressFinalize(this); | ||
| 398 | } | ||
| 399 | |||
| 400 | /// <summary> | ||
| 401 | /// The native methods. | ||
| 402 | /// </summary> | ||
| 403 | private sealed class NativeMethods | ||
| 404 | { | ||
| 405 | /// <summary> | ||
| 406 | /// Protect the constructor since this class only contains static methods. | ||
| 407 | /// </summary> | ||
| 408 | private NativeMethods() | ||
| 409 | { | ||
| 410 | } | ||
| 411 | |||
| 412 | /// <summary> | ||
| 413 | /// Creates a new compound file storage object. | ||
| 414 | /// </summary> | ||
| 415 | /// <param name="pwcsName">The name for the compound file being created.</param> | ||
| 416 | /// <param name="grfMode">Specifies the access mode to use when opening the new storage object.</param> | ||
| 417 | /// <param name="reserved">Reserved for future use; must be zero.</param> | ||
| 418 | /// <returns>A pointer to the location of the IStorage pointer to the new storage object.</returns> | ||
| 419 | [DllImport("ole32.dll", PreserveSig = false)] | ||
| 420 | [return: MarshalAs(UnmanagedType.Interface)] | ||
| 421 | internal static extern IStorage StgCreateDocfile([MarshalAs(UnmanagedType.LPWStr)] string pwcsName, uint grfMode, uint reserved); | ||
| 422 | |||
| 423 | /// <summary> | ||
| 424 | /// Opens an existing root storage object in the file system. | ||
| 425 | /// </summary> | ||
| 426 | /// <param name="pwcsName">The file that contains the storage object to open.</param> | ||
| 427 | /// <param name="pstgPriority">Most often NULL.</param> | ||
| 428 | /// <param name="grfMode">Specifies the access mode to use to open the storage object.</param> | ||
| 429 | /// <param name="snbExclude">If not NULL, pointer to a block of elements in the storage to be excluded as the storage object is opened.</param> | ||
| 430 | /// <param name="reserved">Indicates reserved for future use; must be zero.</param> | ||
| 431 | /// <returns>A pointer to a IStorage* pointer variable that receives the interface pointer to the opened storage.</returns> | ||
| 432 | [DllImport("ole32.dll", PreserveSig = false)] | ||
| 433 | [return: MarshalAs(UnmanagedType.Interface)] | ||
| 434 | internal static extern IStorage StgOpenStorage([MarshalAs(UnmanagedType.LPWStr)] string pwcsName, IntPtr pstgPriority, uint grfMode, IntPtr snbExclude, uint reserved); | ||
| 435 | } | ||
| 436 | } | ||
| 437 | } | ||
