From 3b50149aa546702284c02a943bc221b61fe0e7e2 Mon Sep 17 00:00:00 2001 From: joncham Date: Fri, 20 Oct 2006 17:32:51 +0000 Subject: [PATCH] 2006-10-20 Jonathan Chambers * Variant.cs: Add support for bool and interfaces. git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/mcs@66839 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- class/corlib/System/ChangeLog | 4 ++++ class/corlib/System/Variant.cs | 49 ++++++++++++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/class/corlib/System/ChangeLog b/class/corlib/System/ChangeLog index 691d91f19f..7676f1a2de 100644 --- a/class/corlib/System/ChangeLog +++ b/class/corlib/System/ChangeLog @@ -1,3 +1,7 @@ +2006-10-20 Jonathan Chambers + + * Variant.cs: Add support for bool and interfaces. + 2006-10-18 Kornél Pál * Type.cs: Removed is_subtype_of because IsSubclassOf should be used diff --git a/class/corlib/System/Variant.cs b/class/corlib/System/Variant.cs index 07b0f554ca..e1a730544b 100644 --- a/class/corlib/System/Variant.cs +++ b/class/corlib/System/Variant.cs @@ -88,6 +88,9 @@ namespace System [FieldOffset(8)] public uint uintVal; + [FieldOffset(8)] + public IntPtr pdispVal; + public void SetValue(object obj) { vt = (short)VarEnum.VT_EMPTY; if (obj == null) @@ -148,10 +151,23 @@ namespace System { vt = (short)VarEnum.VT_BSTR; bstrVal = Marshal.StringToBSTR((string)obj); - } - else - { - throw new NotImplementedException(string.Format("Variant couldn't handle object of type {0}", obj.GetType())); + } + else if (t == typeof(bool)) + { + vt = (short)VarEnum.VT_BOOL; + lVal = ((bool)obj) ? -1 : 0; + } + else + { + try + { + vt = (short)VarEnum.VT_DISPATCH; + pdispVal = Marshal.GetIUnknownForObject(obj); + } + catch (Exception ex) + { + throw new NotImplementedException(string.Format("Variant couldn't handle object of type {0}", obj.GetType()), ex); + } } } @@ -189,18 +205,29 @@ namespace System case VarEnum.VT_R8: obj = dblVal; break; + case VarEnum.VT_BOOL: + obj = !(lVal == 0); + break; case VarEnum.VT_BSTR: obj = Marshal.PtrToStringBSTR(bstrVal); break; + case VarEnum.VT_UNKNOWN: + case VarEnum.VT_DISPATCH: + obj = Marshal.GetObjectForIUnknown(pdispVal); + break; } return obj; - } - - public void Clear() { - if ((VarEnum)vt == VarEnum.VT_BSTR) - { - Marshal.FreeBSTR(bstrVal); - } + } + + public void Clear () + { + if ((VarEnum)vt == VarEnum.VT_BSTR) { + Marshal.FreeBSTR (bstrVal); + } + else if ((VarEnum)vt == VarEnum.VT_DISPATCH || (VarEnum)vt == VarEnum.VT_UNKNOWN) { + if (pdispVal != IntPtr.Zero) + Marshal.Release (pdispVal); + } } } } -- 2.11.4.GIT