/// <summary>Initializes a new instance of the <see cref="SafeArrayScopedAccessData"/> class using the array descriptor that holds the data.</summary> /// <param name="psa">An array descriptor created by SafeArrayCreate.</param> public SafeArrayScopedAccessData(SafeSafeArrayDescriptor psa) { var hr = SafeArrayAccessData(psa, out ppvData); hr.ThrowIfFailed(); this.psa = psa; }
public void SafeArrayScopedAccessTest() { SafeSafeArrayDescriptor psa = SafeArrayCreateVector(VARTYPE.VT_I4, 0, 5); { /*for (int i = 0; i < 5; i++) * { * var p = new SafeCoTaskMemHandle(16); * Marshal.GetNativeVariantForObject(i, (IntPtr)p); * Assert.That(SafeArrayPutElement(psa, new[] { i }, (IntPtr)p).Succeeded); * }*/ using (var d = new SafeArrayScopedAccessData(psa)) { //var a = d.Data.ToArray<int>(5); //Assert.That(a, Is.EquivalentTo(new long[] {0, 1, 2, 3, 4})); new[] { 0, 1, 2, 3, 4 }.MarshalToPtr(d.Data); } for (var i = 0; i < 5; i++) { var p = new SafeCoTaskMemHandle(16); Assert.That(SafeArrayGetElement(psa, new[] { i }, (IntPtr)p).Succeeded); var oi = p.ToStructure <int>(); Assert.That(oi, Is.EqualTo(i)); } } psa.Dispose(); }
public void SafeArrayCreateExTest() { var saBound = new SAFEARRAYBOUND { cElements = 5 }; using (SafeSafeArrayDescriptor psa = SafeArrayCreateEx(VARTYPE.VT_I8, 1, ref saBound, IntPtr.Zero)) SafeArrayMethodTest <long>(psa, 5); }
private static void SafeArrayMethodTest <T>(SafeSafeArrayDescriptor psa, int count) { Assert.That(psa, Is.Not.EqualTo(IntPtr.Zero)); Assert.That(SafeArrayGetDim(psa), Is.EqualTo(1)); Assert.That(SafeArrayGetElemsize(psa), Is.EqualTo(Marshal.SizeOf <T>())); Assert.That(SafeArrayGetLBound(psa, 1, out var b).Succeeded); Assert.That(b, Is.EqualTo(0)); Assert.That(SafeArrayGetUBound(psa, 1, out var u).Succeeded); Assert.That(u, Is.EqualTo(count - 1)); }
public void SafeArrayAccessDataTest() { using (SafeSafeArrayDescriptor psa = SafeArrayCreateVector(VARTYPE.VT_I8, 0, 5)) { Assert.That(SafeArrayAccessData(psa, out var pData).Succeeded); Assert.That(pData, Is.Not.EqualTo(IntPtr.Zero)); Assert.That(SafeArrayUnaccessData(psa).Succeeded); using (var d = new SafeArrayScopedAccessData(psa)) Assert.That(d.Data, Is.Not.EqualTo(IntPtr.Zero)); } }
public void SafeArrayGetPutElementTest() { using (SafeSafeArrayDescriptor psa = SafeArrayCreateVector(VARTYPE.VT_I4, 0, 5)) { for (var i = 0; i < 5; i++) { var p = SafeCoTaskMemHandle.CreateFromStructure(i); Assert.That(SafeArrayPutElement(psa, new[] { i }, (IntPtr)p).Succeeded); } for (var i = 0; i < 5; i++) { var p = SafeCoTaskMemHandle.CreateFromStructure <int>(); Assert.That(SafeArrayGetElement(psa, new[] { i }, (IntPtr)p).Succeeded); var oi = p.ToStructure <int>(); Assert.That(oi, Is.EqualTo(i)); } } }
public static extern HRESULT SafeArrayAccessData(SafeSafeArrayDescriptor psa, out IntPtr ppvData);
public static extern HRESULT SafeArrayUnaccessData(SafeSafeArrayDescriptor psa);
public static extern HRESULT SafeArrayPutElement(SafeSafeArrayDescriptor psa, [MarshalAs(UnmanagedType.LPArray)] int[] rgIndicies, [In] IntPtr pv);
public static extern HRESULT SafeArrayGetUBound(SafeSafeArrayDescriptor psa, uint nDim, out int plUbound);
public static extern int SafeArrayGetElemsize(SafeSafeArrayDescriptor pSafeArray);
public static extern uint SafeArrayGetDim(SafeSafeArrayDescriptor psa);
public void SafeArrayCreateVectorTest() { using (SafeSafeArrayDescriptor psa = SafeArrayCreateVector(VARTYPE.VT_I8, 0, 5)) SafeArrayMethodTest <long>(psa, 5); }