Esempio n. 1
0
        public static void SetProperty(this IDispatchEx dispatchEx, string name, bool ignoreCase, params object[] args)
        {
            if (args.Length < 1)
            {
                throw new ArgumentException("Invalid argument count", "args");
            }

            var dispid = dispatchEx.GetDispIDForName(name, true, ignoreCase);

            using (var argVariantArrayBlock = new CoTaskMemVariantArgsBlock(args))
            {
                using (var namedArgDispidBlock = new CoTaskMemBlock(sizeof(int)))
                {
                    EXCEPINFO excepInfo;
                    Marshal.WriteInt32(namedArgDispidBlock.Addr, SpecialDispIDs.PropertyPut);
                    var dispArgs = new DISPPARAMS {
                        cArgs = args.Length, rgvarg = argVariantArrayBlock.Addr, cNamedArgs = 1, rgdispidNamedArgs = namedArgDispidBlock.Addr
                    };

                    var result = dispatchEx.InvokeEx(dispid, 0, DispatchFlags.PropertyPut | DispatchFlags.PropertyPutRef, ref dispArgs, IntPtr.Zero, out excepInfo);
                    if (result == HResult.DISP_E_MEMBERNOTFOUND)
                    {
                        // VBScript objects can be finicky about property-put dispatch flags

                        result = dispatchEx.InvokeEx(dispid, 0, DispatchFlags.PropertyPut, ref dispArgs, IntPtr.Zero, out excepInfo);
                        if (result == HResult.DISP_E_MEMBERNOTFOUND)
                        {
                            result = dispatchEx.InvokeEx(dispid, 0, DispatchFlags.PropertyPutRef, ref dispArgs, IntPtr.Zero, out excepInfo);
                        }
                    }

                    HResult.Check(result);
                }
            }
        }
Esempio n. 2
0
        private static int GetDispIDForName(this IDispatchEx dispatchEx, string name, bool ensure, bool ignoreCase)
        {
            var flags = ignoreCase ? DispatchNameFlags.CaseInsensitive : DispatchNameFlags.CaseSensitive;

            if (ensure)
            {
                flags |= DispatchNameFlags.Ensure;
            }

            var result = dispatchEx.GetDispID(name, flags, out var dispid);

            if (ensure && (result == HResult.DISP_E_UNKNOWNNAME))
            {
                throw new NotSupportedException("The object does not support dynamic properties");
            }

            if (HResult.Succeeded(result))
            {
                return(dispid);
            }

            if (name.IsDispIDName(out dispid))
            {
                return(dispid);
            }

            var member = dispatchEx.GetMembers().FirstOrDefault(testMember => testMember.Name.Equals(name, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal));

            if (member != null)
            {
                return(member.DispID);
            }

            throw new MissingMemberException(MiscHelpers.FormatInvariant("The object has no property named '{0}'", name));
        }
Esempio n. 3
0
        private static IEnumerable <DispatchMember> GetMembersRaw(this IDispatchEx dispatchEx)
        {
            var isEnumerable = false;

            int dispid;
            var result = dispatchEx.GetNextDispID(DispatchEnumFlags.All, SpecialDispIDs.StartEnum, out dispid);

            while (result == HResult.S_OK)
            {
                string name;
                if (HResult.Succeeded(dispatchEx.GetMemberName(dispid, out name)))
                {
                    DispatchPropFlags flags;
                    if (HResult.Succeeded(dispatchEx.GetMemberProperties(dispid, DispatchPropFlags.CanAll, out flags)))
                    {
                        if (dispid == SpecialDispIDs.NewEnum)
                        {
                            isEnumerable = true;
                        }

                        yield return(new DispatchMember(name, dispid, flags));
                    }
                }

                result = dispatchEx.GetNextDispID(DispatchEnumFlags.All, dispid, out dispid);
            }

            if (isEnumerable)
            {
                yield return(new DispatchMember("GetEnumerator", SpecialDispIDs.GetEnumerator, DispatchPropFlags.CanCall));
            }
        }
Esempio n. 4
0
        public static void SetProperty(this IDispatchEx dispatchEx, string name, bool ignoreCase, object[] args)
        {
            if (args.Length < 1)
            {
                throw new ArgumentException("Invalid argument count", "args");
            }

            int dispid;
            var result = dispatchEx.GetDispID(name, DispatchNameFlags.Ensure | (ignoreCase ? DispatchNameFlags.CaseInsensitive : DispatchNameFlags.CaseSensitive), out dispid);

            if (result == RawCOMHelpers.HResult.DISP_E_UNKNOWNNAME)
            {
                throw new NotSupportedException("Object does not support dynamic properties");
            }

            Marshal.ThrowExceptionForHR(result);
            using (var argVariantArrayBlock = new CoTaskMemVariantArgsBlock(args))
            {
                using (var namedArgDispidBlock = new CoTaskMemBlock(sizeof(int)))
                {
                    EXCEPINFO excepInfo;
                    Marshal.WriteInt32(namedArgDispidBlock.Addr, SpecialDispIDs.PropertyPut);
                    var dispArgs = new DISPPARAMS {
                        cArgs = args.Length, rgvarg = argVariantArrayBlock.Addr, cNamedArgs = 1, rgdispidNamedArgs = namedArgDispidBlock.Addr
                    };
                    dispatchEx.InvokeEx(dispid, 0, DispatchFlags.PropertyPut | DispatchFlags.PropertyPutRef, ref dispArgs, IntPtr.Zero, out excepInfo);
                }
            }
        }
Esempio n. 5
0
        private static void GetProperties(object jsonObject, out Dictionary <string, object> properties)
        {
            properties = new Dictionary <string, object>();

            IDispatchEx dispatch = jsonObject as IDispatchEx;

            if (dispatch == null)
            {
                return;
            }

            int id     = DISPID_START_ENUM;
            int nextId = -2;

            while (0 == dispatch.GetNextDispID(fdexEnumAll, id, out nextId))
            {
                string name;
                id = nextId;
                int result = dispatch.GetMemberName(id, out name);
                Debug.Assert(result == 0, "Member name must be present");

                object o = jsonObject.GetType().InvokeMember(name,
                                                             BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null,
                                                             jsonObject, null);

                // now, the property name maybe the instance annotation, while the instance annotation starts with "@"
                if (name.StartsWith("@"))
                {
                    name = name.Substring(1); // remove the @ sign
                }

                properties.Add(name, o);
            }
        }
Esempio n. 6
0
        public static ITypeInfo GetTypeInfo(this IDispatchEx dispatchEx)
        {
            if (HResult.Succeeded(dispatchEx.GetTypeInfoCount(out var count)) && (count > 0))
            {
                if (HResult.Succeeded(dispatchEx.GetTypeInfo(0, 0, out var typeInfo)))
                {
                    return(typeInfo);
                }
            }

            return(null);
        }
Esempio n. 7
0
 public static object Invoke(this IDispatchEx dispatchEx, bool asConstructor, params object[] args)
 {
     using (var argVariantArrayBlock = new CoTaskMemVariantArgsByRefBlock(args))
     {
         using (var resultVariantBlock = new CoTaskMemVariantBlock())
         {
             var dispArgs = new DISPPARAMS {
                 cArgs = args.Length, rgvarg = argVariantArrayBlock.Addr, cNamedArgs = 0, rgdispidNamedArgs = IntPtr.Zero
             };
             HResult.Check(dispatchEx.InvokeEx(SpecialDispIDs.Default, 0, asConstructor ? DispatchFlags.Construct : DispatchFlags.Method, ref dispArgs, resultVariantBlock.Addr, out _));
             return(Marshal.GetObjectForNativeVariant(resultVariantBlock.Addr));
         }
     }
 }
Esempio n. 8
0
 public static object Invoke(this IDispatchEx dispatchEx, object[] args)
 {
     using (var argVariantArrayBlock = new CoTaskMemVariantArgsByRefBlock(args))
     {
         using (var resultVariantBlock = new CoTaskMemVariantBlock())
         {
             EXCEPINFO excepInfo;
             var       dispArgs = new DISPPARAMS {
                 cArgs = args.Length, rgvarg = argVariantArrayBlock.Addr, cNamedArgs = 0, rgdispidNamedArgs = IntPtr.Zero
             };
             dispatchEx.InvokeEx(SpecialDispIDs.Default, 0, DispatchFlags.Method, ref dispArgs, resultVariantBlock.Addr, out excepInfo);
             return(Marshal.GetObjectForNativeVariant(resultVariantBlock.Addr));
         }
     }
 }
        public static IEnumerable <string> GetPropertyNames(this IDispatchEx dispatchEx)
        {
            int dispid;
            var result = dispatchEx.GetNextDispID(DispatchEnumFlags.All, SpecialDispIDs.StartEnum, out dispid);

            while (result == RawCOMHelpers.HResult.S_OK)
            {
                string name;
                if (dispatchEx.GetMemberName(dispid, out name) == RawCOMHelpers.HResult.S_OK)
                {
                    yield return(name);
                }

                result = dispatchEx.GetNextDispID(DispatchEnumFlags.All, dispid, out dispid);
            }
        }
        public static object GetProperty(this IDispatchEx dispatchEx, string name, bool ignoreCase, object[] args)
        {
            int dispid;

            Marshal.ThrowExceptionForHR(dispatchEx.GetDispID(name, ignoreCase ? DispatchNameFlags.CaseInsensitive : DispatchNameFlags.CaseSensitive, out dispid));

            using (var argVariantArrayBlock = new CoTaskMemVariantArgsBlock(args))
            {
                using (var resultVariantBlock = new CoTaskMemVariantBlock())
                {
                    EXCEPINFO excepInfo;
                    var       dispArgs = new DISPPARAMS {
                        cArgs = args.Length, rgvarg = argVariantArrayBlock.Addr, cNamedArgs = 0, rgdispidNamedArgs = IntPtr.Zero
                    };
                    Marshal.ThrowExceptionForHR(dispatchEx.InvokeEx(dispid, 0, DispatchFlags.PropertyGet, ref dispArgs, resultVariantBlock.Addr, out excepInfo));
                    return(Marshal.GetObjectForNativeVariant(resultVariantBlock.Addr));
                }
            }
        }
Esempio n. 11
0
        public static object GetProperty(this IDispatchEx dispatchEx, string name, bool ignoreCase, params object[] args)
        {
            if (!MiscHelpers.Try(out int dispid, () => dispatchEx.GetDispIDForName(name, false, ignoreCase)))
            {
                return(Nonexistent.Value);
            }

            using (var argVariantArrayBlock = new CoTaskMemVariantArgsBlock(args))
            {
                using (var resultVariantBlock = new CoTaskMemVariantBlock())
                {
                    var dispArgs = new DISPPARAMS {
                        cArgs = args.Length, rgvarg = argVariantArrayBlock.Addr, cNamedArgs = 0, rgdispidNamedArgs = IntPtr.Zero
                    };
                    HResult.Check(dispatchEx.InvokeEx(dispid, 0, DispatchFlags.PropertyGet, ref dispArgs, resultVariantBlock.Addr, out _));
                    return(Marshal.GetObjectForNativeVariant(resultVariantBlock.Addr));
                }
            }
        }
Esempio n. 12
0
        public static object InvokeMethod(this IDispatchEx dispatchEx, string name, bool ignoreCase, params object[] args)
        {
            var dispid = dispatchEx.GetDispIDForName(name, false, ignoreCase);

            if (dispid == SpecialDispIDs.GetEnumerator)
            {
                return(dispatchEx.GetProperty(SpecialMemberNames.NewEnum, ignoreCase, args));
            }

            using (var argVariantArrayBlock = new CoTaskMemVariantArgsByRefBlock(args))
            {
                using (var resultVariantBlock = new CoTaskMemVariantBlock())
                {
                    var dispArgs = new DISPPARAMS {
                        cArgs = args.Length, rgvarg = argVariantArrayBlock.Addr, cNamedArgs = 0, rgdispidNamedArgs = IntPtr.Zero
                    };
                    HResult.Check(dispatchEx.InvokeEx(dispid, 0, DispatchFlags.Method, ref dispArgs, resultVariantBlock.Addr, out _));
                    return(Marshal.GetObjectForNativeVariant(resultVariantBlock.Addr));
                }
            }
        }
Esempio n. 13
0
 public static IEnumerable <DispatchMember> GetMembers(this IDispatchEx dispatchEx)
 {
     // ReSharper disable once RedundantEnumerableCastCall
     return(dispatchEx.GetMembersRaw().GroupBy(member => member.DispID, DispatchMember.Merge).OfType <DispatchMember>());
 }
Esempio n. 14
0
 public static IEnumerable <string> GetPropertyNames(this IDispatchEx dispatchEx)
 {
     return(dispatchEx.GetMembers().Select(member => member.Name));
 }
Esempio n. 15
0
 public static bool DeleteProperty(this IDispatchEx dispatchEx, string name, bool ignoreCase)
 {
     return(dispatchEx.DeleteMemberByName(name, ignoreCase ? DispatchNameFlags.CaseInsensitive : DispatchNameFlags.CaseSensitive) == HResult.S_OK);
 }
 public DynamicDispatchExWrapper(IDispatchEx dispatchEx)
 {
     this.dispatchEx = dispatchEx;
 }
Esempio n. 17
0
 public DynamicDispatchExWrapper(HostItem hostItem, IDispatchEx dispatchEx)
 {
     this.hostItem   = hostItem;
     this.dispatchEx = dispatchEx;
 }
Esempio n. 18
0
 private WindowsScriptItem(WindowsScriptEngine engine, IDispatchEx target)
 {
     this.engine = engine;
     this.target = target;
 }