public void SAFEARRAY_CreateSingleDimension_GetProperties_Success(ushort vt, ushort expectedFeatures, uint expectedCbElements) { var saBound = new SAFEARRAYBOUND { cElements = 10, lLbound = 1 }; SAFEARRAY *psa = SafeArrayCreate((VARENUM)vt, 1, &saBound); Assert.True(psa != null); try { Assert.Equal(1u, psa->cDims); Assert.Equal((FADF)expectedFeatures, psa->fFeatures); Assert.Equal((uint)expectedCbElements, psa->cbElements); Assert.Equal(0u, psa->cLocks); Assert.True(psa->pvData != null); Assert.Equal(10u, psa->rgsabound[0].cElements); Assert.Equal(1, psa->rgsabound[0].lLbound); VARENUM arrayVt = VARENUM.EMPTY; HRESULT hr = SafeArrayGetVartype(psa, &arrayVt); Assert.Equal(HRESULT.S_OK, hr); Assert.Equal((VARENUM)vt, arrayVt); } finally { HRESULT hr = SafeArrayDestroy(psa); Assert.Equal(HRESULT.S_OK, hr); } }
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); }
public void SAFEARRAY_CreateSingleDimensionRECORD_GetProperties_Success() { var saBound = new SAFEARRAYBOUND { cElements = 10, lLbound = 1 }; var record = new CustomRecordInfo(); IntPtr pRecord = Marshal.GetComInterfaceForObject <CustomRecordInfo, IRecordInfo>(record); try { SAFEARRAY *psa = SafeArrayCreateEx(VARENUM.RECORD, 1, &saBound, pRecord); Assert.True(psa != null); try { Assert.Equal(1u, psa->cDims); Assert.Equal(FADF.RECORD, psa->fFeatures); Assert.Equal((uint)sizeof(int), psa->cbElements); Assert.Equal(0u, psa->cLocks); Assert.True(psa->pvData != null); Assert.Equal(10u, psa->rgsabound[0].cElements); Assert.Equal(1, psa->rgsabound[0].lLbound); VARENUM arrayVt = VARENUM.EMPTY; HRESULT hr = SafeArrayGetVartype(psa, &arrayVt); Assert.Equal(HRESULT.S_OK, hr); Assert.Equal(VARENUM.RECORD, arrayVt); } finally { HRESULT hr = SafeArrayDestroy(psa); Assert.Equal(HRESULT.S_OK, hr); } } finally { Marshal.Release(pRecord); } }
[DllImport(nameof(OleAut32), ExactSpelling = true)] // psa is actually returned, not hresult public static extern IntPtr SafeArrayCreate(ushort vt, uint cDims, ref SAFEARRAYBOUND rgsabound);
public static extern IntPtr SafeArrayCreate(VarEnum vt, UInt32 cDims, SAFEARRAYBOUND rgsabound);
public static extern IntPtr SafeArrayCreateEx(VARTYPE vt, uint cDims, ref SAFEARRAYBOUND rgsabound, IntPtr pvExtra);