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); } } }
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)); }
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)); } }
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); } } }
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); } }
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); }
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)); } } }
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)); } } }
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)); } } }
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)); } } }
public static IEnumerable <DispatchMember> GetMembers(this IDispatchEx dispatchEx) { // ReSharper disable once RedundantEnumerableCastCall return(dispatchEx.GetMembersRaw().GroupBy(member => member.DispID, DispatchMember.Merge).OfType <DispatchMember>()); }
public static IEnumerable <string> GetPropertyNames(this IDispatchEx dispatchEx) { return(dispatchEx.GetMembers().Select(member => member.Name)); }
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; }
public DynamicDispatchExWrapper(HostItem hostItem, IDispatchEx dispatchEx) { this.hostItem = hostItem; this.dispatchEx = dispatchEx; }
private WindowsScriptItem(WindowsScriptEngine engine, IDispatchEx target) { this.engine = engine; this.target = target; }