mirror of https://github.com/dahall/Vanara.git
141 lines
7.3 KiB
C#
141 lines
7.3 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
using static Vanara.PInvoke.Ole32;
|
|
|
|
namespace Vanara.PInvoke
|
|
{
|
|
public static partial class PropSys
|
|
{
|
|
/// <summary>Describes property change array behavior.</summary>
|
|
[PInvokeData("Propsys.h")]
|
|
public enum PKA_FLAGS
|
|
{
|
|
/// <summary>Replace current value.</summary>
|
|
PKA_SET = 0,
|
|
|
|
/// <summary>Append to current value - multi-value properties only.</summary>
|
|
PKA_APPEND = 1,
|
|
|
|
/// <summary>Delete from current value - multi-value properties only.</summary>
|
|
PKA_DELETE = 2
|
|
}
|
|
|
|
/// <summary>Exposes methods for getting and setting the property key.</summary>
|
|
[PInvokeData("Propsys.h", MSDNShortId = "bb775404")]
|
|
[ComImport, Guid("fc0ca0a7-c316-4fd2-9031-3e628e6d4f23"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
|
public interface IObjectWithPropertyKey
|
|
{
|
|
/// <summary>Sets the property key.</summary>
|
|
/// <param name="key">The property key.</param>
|
|
void SetPropertyKey(in PROPERTYKEY key);
|
|
|
|
/// <summary>Gets the property key.</summary>
|
|
/// <returns>When this returns, contains the property key.</returns>
|
|
PROPERTYKEY GetPropertyKey();
|
|
}
|
|
|
|
/// <summary>Exposes a method that encapsulates a change to a single property.</summary>
|
|
/// <seealso cref="Vanara.PInvoke.PropSys.IObjectWithPropertyKey"/>
|
|
[PInvokeData("Propsys.h", MSDNShortId = "bb775244")]
|
|
[ComImport, Guid("f917bc8a-1bba-4478-a245-1bde03eb9431"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
|
public interface IPropertyChange : IObjectWithPropertyKey
|
|
{
|
|
/// <summary>Sets the property key.</summary>
|
|
/// <param name="key">The property key.</param>
|
|
new void SetPropertyKey(in PROPERTYKEY key);
|
|
|
|
/// <summary>Gets the property key.</summary>
|
|
/// <returns>When this returns, contains the property key.</returns>
|
|
new PROPERTYKEY GetPropertyKey();
|
|
|
|
/// <summary>Applies a change to a property value.</summary>
|
|
/// <param name="propvarIn">A reference to a source PROPVARIANT structure.</param>
|
|
/// <param name="ppropvarOut">A pointer to a changed PROPVARIANT structure.</param>
|
|
void ApplyToPropVariant([In] PROPVARIANT propvarIn, out PROPVARIANT ppropvarOut);
|
|
}
|
|
|
|
/// <summary>Exposes methods for several multiple change operations that may be passed to IFileOperation.</summary>
|
|
[PInvokeData("Propsys.h", MSDNShortId = "bb775223")]
|
|
[ComImport, Guid("380f5cad-1b5e-42f2-805d-637fd392d31e"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
|
public interface IPropertyChangeArray
|
|
{
|
|
/// <summary>Gets the number of change operations in the array.</summary>
|
|
/// <returns>The number of change operations.</returns>
|
|
uint GetCount();
|
|
|
|
/// <summary>Gets the change operation at a specified array index.</summary>
|
|
/// <param name="iIndex">The index of the change to retrieve.</param>
|
|
/// <param name="riid">A reference to the desired IID.</param>
|
|
/// <returns>The address of a pointer to the interface specified by riid, usually IPropertyChange.</returns>
|
|
[return: MarshalAs(UnmanagedType.Interface)]
|
|
object GetAt([In] uint iIndex, in Guid riid);
|
|
|
|
/// <summary>Inserts a change operation into an array at the specified position.</summary>
|
|
/// <param name="iIndex">The index at which the change is inserted.</param>
|
|
/// <param name="ppropChange">A pointer to the interface that contains the change.</param>
|
|
void InsertAt([In] uint iIndex, [In] IPropertyChange ppropChange);
|
|
|
|
/// <summary>Inserts a change operation at the end of an array.</summary>
|
|
/// <param name="ppropChange">A pointer to the interface that contains the change.</param>
|
|
void Append([In] IPropertyChange ppropChange);
|
|
|
|
/// <summary>
|
|
/// Replaces the first occurrence of a change that affects the same property key as the provided change. If the property key is
|
|
/// not already in the array, this method appends the change to the end of the array.
|
|
/// </summary>
|
|
/// <param name="ppropChange">A pointer to the interface that contains the change.</param>
|
|
void AppendOrReplace([In] IPropertyChange ppropChange);
|
|
|
|
/// <summary>Removes a specified change.</summary>
|
|
/// <param name="iIndex">The index of the change to remove.</param>
|
|
void RemoveAt([In] uint iIndex);
|
|
|
|
/// <summary>Specifies whether a particular property key exists in the change array.</summary>
|
|
/// <param name="key">A reference to the PROPERTYKEY structure of interest.</param>
|
|
[PreserveSig] HRESULT IsKeyInArray(in PROPERTYKEY key);
|
|
}
|
|
|
|
/// <summary>Gets the change operation at a specified array index.</summary>
|
|
/// <typeparam name="T">The type of the interface to retrieve.</typeparam>
|
|
/// <param name="pca">The <see cref="IPropertyChangeArray"/> instance.</param>
|
|
/// <param name="iIndex">The index of the change to retrieve.</param>
|
|
/// <returns>The address of a pointer to the interface specified by <typeparamref name="T"/>, usually IPropertyChange.</returns>
|
|
public static T GetAt<T>(this IPropertyChangeArray pca, [In] uint iIndex) where T : class => (T)pca.GetAt(iIndex, typeof(T).GUID);
|
|
|
|
/// <summary>
|
|
/// Creates a container for a set of IPropertyChange objects. This container can be used with IFileOperation to apply a set of
|
|
/// property changes to a set of files.
|
|
/// </summary>
|
|
/// <param name="rgpropkey">
|
|
/// Pointer to an array of PROPERTYKEY structures that name the specific properties whose changes are being stored. If this value is
|
|
/// NULL, cChanges must be 0.
|
|
/// </param>
|
|
/// <param name="rgflags">Pointer to an array of PKA_FLAGS values. If this value is NULL, cChanges must be 0.</param>
|
|
/// <param name="rgpropvar">Pointer to an array of PROPVARIANT structures. If this value is NULL, cChanges must be 0.</param>
|
|
/// <param name="cChanges">
|
|
/// Count of changes to be applied. This is the number of elements in each of the arrays rgpropkey, rgflags, and rgpropvar.
|
|
/// </param>
|
|
/// <param name="riid">Reference to the ID of the requested interface.</param>
|
|
/// <param name="ppv">When this function returns, contains the interface pointer requested in riid. This is typically IPropertyChangeArray.</param>
|
|
/// <returns>If this function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code.</returns>
|
|
[DllImport(Lib.PropSys, ExactSpelling = true)]
|
|
[PInvokeData("Propsys.h", MSDNShortId = "bb776491")]
|
|
public static extern HRESULT PSCreatePropertyChangeArray(
|
|
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] PROPERTYKEY[] rgpropkey,
|
|
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] PKA_FLAGS[] rgflags,
|
|
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] PROPVARIANT[] rgpropvar,
|
|
uint cChanges, in Guid riid, out IPropertyChangeArray ppv);
|
|
|
|
/// <summary>Creates a simple property change.</summary>
|
|
/// <param name="flags">PKA_FLAGS flags.</param>
|
|
/// <param name="key">Reference to a PROPERTYKEY structure.</param>
|
|
/// <param name="propvar">Reference to a PROPVARIANT structure.</param>
|
|
/// <param name="riid">Reference to a specified IID.</param>
|
|
/// <param name="ppv">The address of an IPropertyChange interface pointer.</param>
|
|
/// <returns>If this function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code.</returns>
|
|
[DllImport(Lib.PropSys, ExactSpelling = true)]
|
|
[PInvokeData("Propsys.h", MSDNShortId = "bb776494")]
|
|
public static extern HRESULT PSCreateSimplePropertyChange([In] PKA_FLAGS flags, in PROPERTYKEY key,
|
|
[In] PROPVARIANT propvar, in Guid riid, out IPropertyChange ppv);
|
|
}
|
|
} |