Exemplo n.º 1
0
        private static unsafe void FreePropVariant(IntPtr buffer, int valueOffset)
        {
            // two contigous PROPVARIANT structures that need to be freed
            // the second should only be freed if different from the first
            Debug.Assert(0 == (sizeof(PROPVARIANT) % 8), "unexpected PROPVARIANT size mutiplier");
            Debug.Assert(0 == valueOffset % 8, "unexpected unaligned ptr offset");

            IntPtr currentHandle  = ADP.IntPtrOffset(buffer, valueOffset);
            IntPtr originalHandle = ADP.IntPtrOffset(buffer, valueOffset + sizeof(PROPVARIANT));
            bool   different      = NativeOledbWrapper.MemoryCompare(currentHandle, originalHandle, sizeof(PROPVARIANT));

            RuntimeHelpers.PrepareConstrainedRegions();
            try
            { }
            finally
            {
                // always clear the first structure
                Interop.Ole32.PropVariantClear(currentHandle);
                if (different)
                {
                    // second structure different from the first
                    Interop.Ole32.PropVariantClear(originalHandle);
                }
                else
                {
                    // second structure same as the first, just clear the field
                    SafeNativeMethods.ZeroMemory(originalHandle, sizeof(PROPVARIANT));
                }
            }
        }
        private static void FreeVariant(IntPtr buffer, int valueOffset)
        {
            IntPtr ptr2 = ADP.IntPtrOffset(buffer, valueOffset);
            IntPtr ptr  = ADP.IntPtrOffset(buffer, valueOffset + ODB.SizeOf_Variant);
            bool   flag = NativeOledbWrapper.MemoryCompare(ptr2, ptr, ODB.SizeOf_Variant);

            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
            }
            finally
            {
                SafeNativeMethods.VariantClear(ptr2);
                if (flag)
                {
                    SafeNativeMethods.VariantClear(ptr);
                }
                else
                {
                    SafeNativeMethods.ZeroMemory(ptr, (IntPtr)ODB.SizeOf_Variant);
                }
            }
        }