/// <summary> /// frees all unmanaged memory assoicated with a DISPPARAMS structure /// see https://msdn.microsoft.com/en-us/library/windows/desktop/ms221416(v=vs.85).aspx /// </summary> /// <param name="pDispParams"></param> private static void UnprepareDispatchArgs(ComTypes.DISPPARAMS pDispParams) { if (pDispParams.rgvarg != IntPtr.Zero) { // free the array of COM VARIANTs var variantStructSize = RdMarshal.SizeOf(typeof(VARIANT)); var variantArgsArrayOffset = pDispParams.rgvarg; var argIndex = 0; while (argIndex < pDispParams.cArgs) { VariantClear(variantArgsArrayOffset); variantArgsArrayOffset += variantStructSize; argIndex++; } RdMarshal.FreeHGlobal(pDispParams.rgvarg); } }