mirror of https://github.com/dahall/Vanara.git
Breaking change: Simplified Shell32.KNOWNFOLDER_DEFINITION to use strings instead of StrPtrUni field types. After testing, it appears that .NET does release the memory during the conversion process to System.String.
parent
ce28b45d48
commit
c24b9394e3
|
@ -42,6 +42,14 @@ public static class KnownFolderIdExt
|
||||||
/// <returns>The <see cref="IShellItem"/> instance.</returns>
|
/// <returns>The <see cref="IShellItem"/> instance.</returns>
|
||||||
public static IShellItem? GetIShellItem(this KNOWNFOLDERID id) => SHGetKnownFolderItem<IShellItem>(id);
|
public static IShellItem? GetIShellItem(this KNOWNFOLDERID id) => SHGetKnownFolderItem<IShellItem>(id);
|
||||||
|
|
||||||
|
/// <summary>Returns the <see cref="KNOWNFOLDERID"/> corresponding to the provided <paramref name="guid"/> value.</summary>
|
||||||
|
/// <param name="guid">The unique identifier representing a known folder.</param>
|
||||||
|
/// <returns>A corresponding <see cref="KNOWNFOLDERID"/>, if found. If not, an exception is thrown.</returns>
|
||||||
|
/// <exception cref="ArgumentOutOfRangeException">guid - Provided GUID value does not correspond to a known folder.</exception>
|
||||||
|
public static KNOWNFOLDERID KnownFolderId(this Guid guid) =>
|
||||||
|
AssociateAttribute.TryEnumLookup<KNOWNFOLDERID>(guid, out var kf) ? kf :
|
||||||
|
throw new ArgumentOutOfRangeException(nameof(guid), "Provided GUID value does not correspond to a known folder.");
|
||||||
|
|
||||||
/// <summary>Gets a registry property associated with this known folder.</summary>
|
/// <summary>Gets a registry property associated with this known folder.</summary>
|
||||||
/// <typeparam name="T">Return type.</typeparam>
|
/// <typeparam name="T">Return type.</typeparam>
|
||||||
/// <param name="id">The known folder.</param>
|
/// <param name="id">The known folder.</param>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace Vanara.PInvoke;
|
namespace Vanara.PInvoke;
|
||||||
|
@ -1773,11 +1774,12 @@ public static partial class Shell32
|
||||||
// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-freeknownfolderdefinitionfields void
|
// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-freeknownfolderdefinitionfields void
|
||||||
// FreeKnownFolderDefinitionFields( KNOWNFOLDER_DEFINITION *pKFD );
|
// FreeKnownFolderDefinitionFields( KNOWNFOLDER_DEFINITION *pKFD );
|
||||||
[PInvokeData("shobjidl_core.h", MSDNShortId = "0ad17dd3-e612-403a-b8c3-e93d5f259c1f")]
|
[PInvokeData("shobjidl_core.h", MSDNShortId = "0ad17dd3-e612-403a-b8c3-e93d5f259c1f")]
|
||||||
public static void FreeKnownFolderDefinitionFields(in KNOWNFOLDER_DEFINITION pKFD)
|
[Obsolete("Unnecessary when using PInvoke since values are freed when converting to System.String. This method does nothing.")]
|
||||||
{
|
public static void FreeKnownFolderDefinitionFields(in KNOWNFOLDER_DEFINITION pKFD) { }
|
||||||
foreach (var fi in pKFD.GetType().GetFields().Where(f => f.FieldType == typeof(StrPtrUni)))
|
//{
|
||||||
Marshal.FreeCoTaskMem((IntPtr)(StrPtrUni)fi.GetValue(pKFD)!);
|
// foreach (var fi in pKFD.GetType().GetFields().Where(f => f.FieldType == typeof(StrPtrUni)))
|
||||||
}
|
// Marshal.FreeCoTaskMem((IntPtr)(StrPtrUni)fi.GetValue(pKFD)!);
|
||||||
|
//}
|
||||||
|
|
||||||
/// <summary>Gets an array of all registered known folder IDs. This can be used in enumerating all known folders.</summary>
|
/// <summary>Gets an array of all registered known folder IDs. This can be used in enumerating all known folders.</summary>
|
||||||
/// <param name="mgr">The <see cref="IKnownFolderManager"/> instance.</param>
|
/// <param name="mgr">The <see cref="IKnownFolderManager"/> instance.</param>
|
||||||
|
@ -1826,13 +1828,15 @@ public static partial class Shell32
|
||||||
/// settings. This name is meant to be a unique, human-readable name. Third parties are recommended to follow the format
|
/// settings. This name is meant to be a unique, human-readable name. Third parties are recommended to follow the format
|
||||||
/// Company.Application.Name. The name given here should not be confused with the display name.
|
/// Company.Application.Name. The name given here should not be confused with the display name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public StrPtrUni pszName;
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pszName;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A pointer to a short description of the known folder, stored as a null-terminated Unicode string. This description should
|
/// A pointer to a short description of the known folder, stored as a null-terminated Unicode string. This description should
|
||||||
/// include the folder's purpose and usage.
|
/// include the folder's purpose and usage.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public StrPtrUni pszDescription;
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pszDescription;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A KNOWNFOLDERID value that names another known folder to serve as the parent folder. Applies to common and per-user folders
|
/// A KNOWNFOLDERID value that names another known folder to serve as the parent folder. Applies to common and per-user folders
|
||||||
|
@ -1841,18 +1845,32 @@ public static partial class Shell32
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Guid fidParent;
|
public Guid fidParent;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A KNOWNFOLDERID enumeration value that names another known folder to serve as the parent folder. Applies to common and per-user
|
||||||
|
/// folders only. This value is used in conjunction with pszRelativePath. See Remarks for more details. This value is optional if no
|
||||||
|
/// value is provided for pszRelativePath. On retrieval, if the value does not map to an enuumeration value, a <see langword="null"/>
|
||||||
|
/// is returned. If a <see langword="null"/> is provided when setting, it maps to <see cref="Guid.Empty"/>.
|
||||||
|
/// </summary>
|
||||||
|
public KNOWNFOLDERID? fidParentEnum
|
||||||
|
{
|
||||||
|
readonly get => AssociateAttribute.TryEnumLookup(fidParent, out KNOWNFOLDERID kf) ? kf : null;
|
||||||
|
set => fidParent = value.HasValue ? value.Value.Guid() : Guid.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Optional. A pointer to a path relative to the parent folder specified in fidParent. This is a null-terminated Unicode
|
/// Optional. A pointer to a path relative to the parent folder specified in fidParent. This is a null-terminated Unicode
|
||||||
/// string, refers to the physical file system path, and is not localized. Applies to common and per-user folders only. See
|
/// string, refers to the physical file system path, and is not localized. Applies to common and per-user folders only. See
|
||||||
/// Remarks for more details.
|
/// Remarks for more details.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public StrPtrUni pszRelativePath;
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string? pszRelativePath;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A pointer to the Shell namespace folder path of the folder, stored as a null-terminated Unicode string. Applies to virtual
|
/// A pointer to the Shell namespace folder path of the folder, stored as a null-terminated Unicode string. Applies to virtual
|
||||||
/// folders only. For example, Control Panel has a parsing name of ::%CLSID_MyComputer%\::%CLSID_ControlPanel%.
|
/// folders only. For example, Control Panel has a parsing name of ::%CLSID_MyComputer%\::%CLSID_ControlPanel%.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public StrPtrUni pszParsingName;
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pszParsingName;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Optional. A pointer to the default tooltip resource used for this known folder when it is created. This is a null-terminated
|
/// Optional. A pointer to the default tooltip resource used for this known folder when it is created. This is a null-terminated
|
||||||
|
@ -1864,7 +1882,8 @@ public static partial class Shell32
|
||||||
/// </para>
|
/// </para>
|
||||||
/// <para>This information is not required for virtual folders.</para>
|
/// <para>This information is not required for virtual folders.</para>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public StrPtrUni pszTooltip;
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string? pszTooltip;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Optional. A pointer to the default localized name resource used when the folder is created. This is a null-terminated
|
/// Optional. A pointer to the default localized name resource used when the folder is created. This is a null-terminated
|
||||||
|
@ -1876,7 +1895,8 @@ public static partial class Shell32
|
||||||
/// </para>
|
/// </para>
|
||||||
/// <para>This information is not required for virtual folders.</para>
|
/// <para>This information is not required for virtual folders.</para>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public StrPtrUni pszLocalizedName;
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string? pszLocalizedName;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Optional. A pointer to the default icon resource used when the folder is created. This is a null-terminated Unicode string
|
/// Optional. A pointer to the default icon resource used when the folder is created. This is a null-terminated Unicode string
|
||||||
|
@ -1888,7 +1908,8 @@ public static partial class Shell32
|
||||||
/// </para>
|
/// </para>
|
||||||
/// <para>This information is not required for virtual folders.</para>
|
/// <para>This information is not required for virtual folders.</para>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public StrPtrUni pszIcon;
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string? pszIcon;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Optional. A pointer to a Security Descriptor Definition Language format string. This is a null-terminated Unicode string
|
/// Optional. A pointer to a Security Descriptor Definition Language format string. This is a null-terminated Unicode string
|
||||||
|
@ -1896,7 +1917,8 @@ public static partial class Shell32
|
||||||
/// new folder inherits the security descriptor of its parent. This is particularly useful for common folders that are accessed
|
/// new folder inherits the security descriptor of its parent. This is particularly useful for common folders that are accessed
|
||||||
/// by all users.
|
/// by all users.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public StrPtrUni pszSecurity;
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string? pszSecurity;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Optional. Default file system attributes given to the folder when it is created. For example, the file could be hidden and
|
/// Optional. Default file system attributes given to the folder when it is created. For example, the file could be hidden and
|
||||||
|
@ -1917,24 +1939,15 @@ public static partial class Shell32
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Guid ftidType;
|
public Guid ftidType;
|
||||||
|
|
||||||
/// <summary>Frees the allocated fields in the result from IKnownFolder::GetFolderDefinition.</summary>
|
/// <summary>
|
||||||
/// <remarks>
|
/// One of the FOLDERTYPEID enumeration values that identifies the known folder type based on its contents (such as documents, music,
|
||||||
/// This is an inline helper function that calls CoTaskMemFree on the fields in the structure that need to be freed. Its
|
/// or photographs). On retrieval, if the value does not map to an enuumeration value, a <see langword="null"/> is returned. If a
|
||||||
/// implementation can be seen in the header file.
|
/// <see langword="null"/> is provided when setting, it maps to <see cref="Guid.Empty"/>.
|
||||||
/// </remarks>
|
/// </summary>
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-freeknownfolderdefinitionfields void
|
public FOLDERTYPEID? ftidTypeEnum
|
||||||
// FreeKnownFolderDefinitionFields( KNOWNFOLDER_DEFINITION *pKFD );
|
|
||||||
[PInvokeData("shobjidl_core.h", MSDNShortId = "NF:shobjidl_core.FreeKnownFolderDefinitionFields")]
|
|
||||||
public void FreeKnownFolderDefinitionFields()
|
|
||||||
{
|
{
|
||||||
Marshal.FreeCoTaskMem((IntPtr)pszName);
|
readonly get => AssociateAttribute.TryEnumLookup(ftidType, out FOLDERTYPEID kf) ? kf : null;
|
||||||
Marshal.FreeCoTaskMem((IntPtr)pszDescription);
|
set => ftidType = value.HasValue ? value.Value.Guid() : Guid.Empty;
|
||||||
Marshal.FreeCoTaskMem((IntPtr)pszRelativePath);
|
|
||||||
Marshal.FreeCoTaskMem((IntPtr)pszParsingName);
|
|
||||||
Marshal.FreeCoTaskMem((IntPtr)pszTooltip);
|
|
||||||
Marshal.FreeCoTaskMem((IntPtr)pszLocalizedName);
|
|
||||||
Marshal.FreeCoTaskMem((IntPtr)pszIcon);
|
|
||||||
Marshal.FreeCoTaskMem((IntPtr)pszSecurity);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1951,6 +1964,14 @@ public static partial class Shell32
|
||||||
|
|
||||||
/// <summary>Initializes a new instance of the <see cref="KnownFolderDetailAttribute"/> class with a GUID for the <see cref="KNOWNFOLDERID"/>.</summary>
|
/// <summary>Initializes a new instance of the <see cref="KnownFolderDetailAttribute"/> class with a GUID for the <see cref="KNOWNFOLDERID"/>.</summary>
|
||||||
/// <param name="knownFolderGuid">The GUID for the <see cref="KNOWNFOLDERID"/>.</param>
|
/// <param name="knownFolderGuid">The GUID for the <see cref="KNOWNFOLDERID"/>.</param>
|
||||||
public KnownFolderDetailAttribute(string knownFolderGuid) : base(knownFolderGuid) { }
|
public KnownFolderDetailAttribute(string knownFolderGuid) : base(knownFolderGuid)
|
||||||
|
{
|
||||||
|
if (TryEnumLookup<KNOWNFOLDERID>(Guid, out var kf))
|
||||||
|
{
|
||||||
|
var sf = kf.SpecialFolder();
|
||||||
|
if (sf.HasValue)
|
||||||
|
Equivalent = sf.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue