/// <summary>
 /// Creates a <see cref="PropertyKey"/> with the specified <see cref="FmtId"/> and <see cref="Pid"/>
 /// </summary>
 /// <param name="fmtid">The <see cref="Guid"/> that identifies this PropertyKey</param>
 /// <param name="pid">The numerical pid that identifies this PropertyKey</param>
 public PropertyKey(Guid fmtid, uint pid)
 {
     _propKey = new PROPERTYKEY()
     {
         fmtid = fmtid, pid = pid
     };
 }
        /// <summary>
        /// Creates a <see cref="PropertyKey"/>  from either a canonical name or a formatted PropertyKey.
        /// </summary>
        /// <param name="formatString">This string may either be the canonical name of a PropertyKey, or a formatted PropertyKey string.
        /// The former of these formats contain two or more user friendly names, delimited by a period(.) e.g. "System.Title", "System.Image.Dimensions". The other format is a string consisting of the
        /// PropertyKey's <see cref="FmtId"/>, which is a <see cref="Guid"/>, and the <see cref="Pid"/>, which is an integral value. The string will be formatted as "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} nn",
        /// where the {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} is the formatted Guid, and the nn is the Pid.
        /// </param>
        public PropertyKey(string formatString)
        {
            HRESULT hr;

            _ppk = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(PROPERTYKEY)));
            try {
                // Is it a formatted propertykey or a canonical name?
                if (formatString.StartsWith("{"))
                {
                    hr = PSPropertyKeyFromString(formatString, _ppk);
                    if (hr.Failed)
                    {
                        throw hr.GetException();
                    }
                }
                else
                {
                    hr = PSGetPropertyKeyFromName(formatString, _ppk);
                    if (hr.Failed)
                    {
                        throw hr.GetException();
                    }
                }
            }
            catch {
                Marshal.FreeCoTaskMem(_ppk);
                _ppk = IntPtr.Zero;
                throw;
            }
            _propKey = Marshal.PtrToStructure <PROPERTYKEY>(_ppk);
        }
 internal PropertyKey(IntPtr ppk)
 {
     _ppk     = ppk;
     _propKey = Marshal.PtrToStructure <PROPERTYKEY>(_ppk);
 }
 internal PropertyKey()
 {
     _propKey = new PROPERTYKEY();
 }
 internal PropertyKey(PROPERTYKEY propKey)
 {
     _propKey = propKey;
 }