Bug fixes and cleanup for PROPVARIANT

pull/25/head
David Hall 2018-11-27 12:02:37 -07:00
parent c5467dfb7e
commit d90bc7ec42
4 changed files with 552 additions and 647 deletions

File diff suppressed because it is too large Load Diff

View File

@ -184,7 +184,7 @@ namespace Vanara.PInvoke
/// <summary>An unsigned integer.</summary> /// <summary>An unsigned integer.</summary>
[CorrespondingType(typeof(uint))] [CorrespondingType(typeof(uint))]
VT_UINT = 23, VT_UINT = 23,
/// <summary>The vt void</summary> /// <summary>A C-style void.</summary>
[CorrespondingType(typeof(IntPtr))] [CorrespondingType(typeof(IntPtr))]
VT_VOID = 24, VT_VOID = 24,
/// <summary>A C-style void.</summary> /// <summary>A C-style void.</summary>
@ -232,7 +232,7 @@ namespace Vanara.PInvoke
/// <summary>A clipboard format.</summary> /// <summary>A clipboard format.</summary>
[CorrespondingType(typeof(CLIPDATA))] [CorrespondingType(typeof(CLIPDATA))]
VT_CF = 71, VT_CF = 71,
/// <summary>A class ID.</summary> /// <summary>A class ID (GUID).</summary>
[CorrespondingType(typeof(Guid))] [CorrespondingType(typeof(Guid))]
VT_CLSID = 72, VT_CLSID = 72,
/// <summary>A stream with a GUID version.</summary> /// <summary>A stream with a GUID version.</summary>

View File

@ -299,6 +299,20 @@ namespace Vanara.PInvoke
[PInvokeData("propvarutil.h", MSDNShortId = "c958f823-f820-4b0b-86ed-84ad18befbd1")] [PInvokeData("propvarutil.h", MSDNShortId = "c958f823-f820-4b0b-86ed-84ad18befbd1")]
public static extern HRESULT InitPropVariantFromResource(HINSTANCE hinst, uint id, [In, Out] PROPVARIANT ppropvar); public static extern HRESULT InitPropVariantFromResource(HINSTANCE hinst, uint id, [In, Out] PROPVARIANT ppropvar);
/// <summary>Initializes the property variant from string.</summary>
/// <param name="psz">Pointer to a buffer that contains the source Unicode string.</param>
/// <param name="ppropvar">When this function returns, contains the initialized PROPVARIANT structure.</param>
/// <returns>If this function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code.</returns>
[PInvokeData("propvarutil.h", MSDNShortId = "cee95d17-532d-8e34-a392-a04778f9bc00")]
public static HRESULT InitPropVariantFromString(string psz, [In, Out] PROPVARIANT ppropvar)
{
PropVariantClear(ppropvar);
if (psz is null) return HRESULT.E_INVALIDARG;
ppropvar._ptr = Marshal.StringToCoTaskMemUni(psz);
ppropvar.vt = VARTYPE.VT_LPWSTR;
return HRESULT.S_OK;
}
/// <summary> /// <summary>
/// <para> /// <para>
/// Initializes a PROPVARIANT structure from a specified string. The string is parsed as a semi-colon delimited list (for example: "A;B;C"). /// Initializes a PROPVARIANT structure from a specified string. The string is parsed as a semi-colon delimited list (for example: "A;B;C").

View File

@ -101,6 +101,7 @@ namespace Vanara.PInvoke.Tests
} }
} }
[TestCase(VARTYPE.VT_CF, "pclipdata")]
[TestCase(VARTYPE.VT_ARRAY | VARTYPE.VT_VARIANT, "parray")] [TestCase(VARTYPE.VT_ARRAY | VARTYPE.VT_VARIANT, "parray")]
[TestCase(VARTYPE.VT_BLOB, "blob")] [TestCase(VARTYPE.VT_BLOB, "blob")]
[TestCase(VARTYPE.VT_BSTR, "bstrVal")] [TestCase(VARTYPE.VT_BSTR, "bstrVal")]
@ -112,7 +113,6 @@ namespace Vanara.PInvoke.Tests
[TestCase(VARTYPE.VT_BYREF | VARTYPE.VT_ERROR, "pscode")] [TestCase(VARTYPE.VT_BYREF | VARTYPE.VT_ERROR, "pscode")]
[TestCase(VARTYPE.VT_BYREF | VARTYPE.VT_UNKNOWN, "ppunkVal")] [TestCase(VARTYPE.VT_BYREF | VARTYPE.VT_UNKNOWN, "ppunkVal")]
[TestCase(VARTYPE.VT_BYREF | VARTYPE.VT_VARIANT, "pvarVal")] [TestCase(VARTYPE.VT_BYREF | VARTYPE.VT_VARIANT, "pvarVal")]
//[TestCase(VARTYPE.VT_CF, "pclipdata")]
[TestCase(VARTYPE.VT_CY, "cyVal")] [TestCase(VARTYPE.VT_CY, "cyVal")]
[TestCase(VARTYPE.VT_CLSID, "puuid")] [TestCase(VARTYPE.VT_CLSID, "puuid")]
[TestCase(VARTYPE.VT_DATE, "date")] [TestCase(VARTYPE.VT_DATE, "date")]
@ -124,17 +124,17 @@ namespace Vanara.PInvoke.Tests
[TestCase(VARTYPE.VT_STORAGE, "pStorage")] [TestCase(VARTYPE.VT_STORAGE, "pStorage")]
[TestCase(VARTYPE.VT_STREAM, "pStream")] [TestCase(VARTYPE.VT_STREAM, "pStream")]
[TestCase(VARTYPE.VT_UNKNOWN, "punkVal")] [TestCase(VARTYPE.VT_UNKNOWN, "punkVal")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_BSTR, "cabstr")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_CF, "caclipdata")] [TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_CF, "caclipdata")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_CLSID, "cauuid")] [TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_CLSID, "cauuid")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_CY, "cacy")] [TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_CY, "cacy")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_DATE, "cadate")] [TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_DATE, "cadate")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_ERROR, "cascode")] [TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_ERROR, "cascode")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_FILETIME, "cafiletime")] [TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_FILETIME, "cafiletime")]
//[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_LPSTR, "calpstr")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_LPWSTR, "calpwstr")] [TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_LPWSTR, "calpwstr")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_VARIANT, "capropvar")] [TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_VARIANT, "capropvar")]
[TestCase(VARTYPE.VT_VERSIONED_STREAM, "pVersionedStream")] [TestCase(VARTYPE.VT_VERSIONED_STREAM, "pVersionedStream")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_BSTR, "cabstr")]
[TestCase(VARTYPE.VT_VECTOR | VARTYPE.VT_LPSTR, "calpstr")]
public void PROPVARIANTOtherPropsTest(VARTYPE vt, string prop) public void PROPVARIANTOtherPropsTest(VARTYPE vt, string prop)
{ {
object value; object value;
@ -145,16 +145,18 @@ namespace Vanara.PInvoke.Tests
{ {
var isa = value.GetType().IsArray; var isa = value.GetType().IsArray;
Assert.That(pv.vt, Is.EqualTo(vt)); Assert.That(pv.vt, Is.EqualTo(vt));
var pvVal = pv.Value;
if (isa) if (isa)
Assert.That(pv.Value, Is.EquivalentTo((IEnumerable)value)); Assert.That(pvVal, Is.EquivalentTo((IEnumerable)value));
else else
Assert.That(pv.Value, Is.EqualTo(value)); Assert.That(pvVal, Is.EqualTo(value));
var pi = pv.GetType().GetProperty(prop); var pi = pv.GetType().GetProperty(prop);
Assert.That(pi, Is.Not.Null); Assert.That(pi, Is.Not.Null);
var piVal = pi.GetValue(pv);
if (isa) if (isa)
Assert.That(pi.GetValue(pv), Is.EquivalentTo((IEnumerable)value)); Assert.That(piVal, Is.EquivalentTo((IEnumerable)value));
else else
Assert.That(pi.GetValue(pv), Is.EqualTo(value)); Assert.That(piVal, Is.EqualTo(value));
} }
}, Throws.Nothing); }, Throws.Nothing);
} }
@ -262,8 +264,9 @@ namespace Vanara.PInvoke.Tests
return new Win32Error(5); return new Win32Error(5);
case VARTYPE.VT_FILETIME: case VARTYPE.VT_FILETIME:
return new DateTime(1999, 12, 31, 23, 59, 59).ToFileTimeStruct(); return new DateTime(1999, 12, 31, 23, 59, 59).ToFileTimeStruct();
case VARTYPE.VT_BSTR:
case VARTYPE.VT_BYREF | VARTYPE.VT_BSTR: case VARTYPE.VT_BYREF | VARTYPE.VT_BSTR:
return Marshal.StringToBSTR("string");
case VARTYPE.VT_BSTR:
case VARTYPE.VT_LPSTR: case VARTYPE.VT_LPSTR:
case VARTYPE.VT_LPWSTR: case VARTYPE.VT_LPWSTR:
return "string"; return "string";