示例#1
0
        /// <summary>
        /// Get the currently registered managed object or creates a new managed object and registers it.
        /// </summary>
        /// <param name="impl">The <see cref="ComWrappers" /> implementation to use when creating the managed object.</param>
        /// <param name="externalComObject">Object to import for usage into the .NET runtime.</param>
        /// <param name="innerMaybe">The inner instance if aggregation is involved</param>
        /// <param name="flags">Flags used to describe the external object.</param>
        /// <param name="wrapperMaybe">The <see cref="object"/> to be used as the wrapper for the external object.</param>
        /// <param name="retValue">The managed object associated with the supplied external COM object or <c>null</c> if it could not be created.</param>
        /// <returns>Returns <c>true</c> if a managed object could be retrieved/created, <c>false</c> otherwise</returns>
        /// <remarks>
        /// If <paramref name="impl" /> is <c>null</c>, the global instance (if registered) will be used.
        /// </remarks>
        private static bool TryGetOrCreateObjectForComInstanceInternal(
            ComWrappers impl,
            IntPtr externalComObject,
            IntPtr innerMaybe,
            CreateObjectFlags flags,
            object?wrapperMaybe,
            out object?retValue
            )
        {
            if (externalComObject == IntPtr.Zero)
            {
                throw new ArgumentNullException(nameof(externalComObject));
            }

            // If the inner is supplied the Aggregation flag should be set.
            if (innerMaybe != IntPtr.Zero && !flags.HasFlag(CreateObjectFlags.Aggregation))
            {
                throw new InvalidOperationException(
                          SR.InvalidOperation_SuppliedInnerMustBeMarkedAggregation
                          );
            }

            object?wrapperMaybeLocal = wrapperMaybe;

            retValue = null;
            return(TryGetOrCreateObjectForComInstanceInternal(
                       ObjectHandleOnStack.Create(ref impl),
                       impl.id,
                       externalComObject,
                       innerMaybe,
                       flags,
                       ObjectHandleOnStack.Create(ref wrapperMaybeLocal),
                       ObjectHandleOnStack.Create(ref retValue)
                       ));
        }
示例#2
0
        /// <summary>
        /// Get the currently registered managed object or uses the supplied managed object and registers it.
        /// </summary>
        /// <param name="externalComObject">Object to import for usage into the .NET runtime.</param>
        /// <param name="flags">Flags used to describe the external object.</param>
        /// <param name="wrapper">The <see cref="object"/> to be used as the wrapper for the external object</param>
        /// <param name="inner">Inner for COM aggregation scenarios</param>
        /// <returns>Returns a managed object associated with the supplied external COM object.</returns>
        /// <remarks>
        /// This method override is for registering an aggregated COM instance with its associated inner. The inner
        /// will be released when the associated wrapper is eventually freed. Note that it will be released on a thread
        /// in an unknown apartment state. If the supplied inner is not known to be a free-threaded instance then
        /// it is advised to not supply the inner.
        ///
        /// If the <paramref name="wrapper"/> instance already has an associated external object a <see cref="System.NotSupportedException"/> will be thrown.
        /// </remarks>
        public object GetOrRegisterObjectForComInstance(
            IntPtr externalComObject,
            CreateObjectFlags flags,
            object wrapper,
            IntPtr inner
            )
        {
            if (wrapper == null)
            {
                throw new ArgumentNullException(nameof(wrapper));
            }

            object?obj;

            if (
                !TryGetOrCreateObjectForComInstanceInternal(
                    this,
                    externalComObject,
                    inner,
                    flags,
                    wrapper,
                    out obj
                    )
                )
            {
                throw new ArgumentNullException(nameof(externalComObject));
            }

            return(obj !);
        }
示例#3
0
            protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flag)
            {
                if (ReturnInvalid)
                {
                    return(null);
                }

                Guid[] iids =
                {
                    typeof(ITrackerObject).GUID,
                    typeof(ITest).GUID,
                    typeof(Server.Contract.IDispatchTesting).GUID,
                    typeof(Server.Contract.IConsumeNETServer).GUID
                };

                for (var i = 0; i < iids.Length; i++)
                {
                    var    iid = iids[i];
                    IntPtr comObject;
                    int    hr = Marshal.QueryInterface(externalComObject, ref iid, out comObject);
                    if (hr == 0)
                    {
                        return(new FakeWrapper(comObject));
                    }
                }

                return(null);
            }
示例#4
0
        // Called by the runtime to execute the abstract instance function.
        internal static object?CallCreateObject(
            ComWrappersScenario scenario,
            ComWrappers?comWrappersImpl,
            IntPtr externalComObject,
            CreateObjectFlags flags
            )
        {
            ComWrappers?impl = null;

            switch (scenario)
            {
            case ComWrappersScenario.Instance:
                impl = comWrappersImpl;
                break;

            case ComWrappersScenario.TrackerSupportGlobalInstance:
                impl = s_globalInstanceForTrackerSupport;
                break;

            case ComWrappersScenario.MarshallingGlobalInstance:
                impl = s_globalInstanceForMarshalling;
                break;
            }

            if (impl == null)
            {
                return(null);
            }

            return(impl.CreateObject(externalComObject, flags));
        }
示例#5
0
        protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
        {
            Debug.Assert(flags == CreateObjectFlags.UniqueInstance || flags == CreateObjectFlags.None || flags == CreateObjectFlags.Unwrap);

            Guid pictureIID = IID.IPicture;
            int  hr         = Marshal.QueryInterface(externalComObject, ref pictureIID, out IntPtr pictureComObject);

            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new PictureWrapper(pictureComObject));
            }

            Guid fileOpenDialogIID = IID.IFileOpenDialog;

            hr = Marshal.QueryInterface(externalComObject, ref fileOpenDialogIID, out IntPtr fileOpenDialogComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new FileOpenDialogWrapper(fileOpenDialogComObject));
            }

            Guid fileSaveDialogIID = IID.IFileSaveDialog;

            hr = Marshal.QueryInterface(externalComObject, ref fileSaveDialogIID, out IntPtr fileSaveDialogComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new FileSaveDialogWrapper(fileSaveDialogComObject));
            }

            Guid shellItemIID = IID.IShellItem;

            hr = Marshal.QueryInterface(externalComObject, ref shellItemIID, out IntPtr shellItemComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new ShellItemWrapper(shellItemComObject));
            }

            Guid shellItemArrayIID = IID.IShellItemArray;

            hr = Marshal.QueryInterface(externalComObject, ref shellItemArrayIID, out IntPtr shellItemArrayComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new ShellItemArrayWrapper(shellItemArrayComObject));
            }

            Guid autoCompleteIID = IID.IAutoComplete2;

            hr = Marshal.QueryInterface(externalComObject, ref autoCompleteIID, out IntPtr autoCompleteComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new AutoCompleteWrapper(autoCompleteComObject));
            }

            throw new NotImplementedException();
        }
示例#6
0
 private static extern bool TryGetOrCreateObjectForComInstanceInternal(
     ObjectHandleOnStack comWrappersImpl,
     long wrapperId,
     IntPtr externalComObject,
     IntPtr innerMaybe,
     CreateObjectFlags flags,
     ObjectHandleOnStack wrapper,
     ObjectHandleOnStack retValue
     );
示例#7
0
        /// <summary>
        /// Get the currently registered managed object or uses the supplied managed object and registers it.
        /// </summary>
        /// <param name="externalComObject">Object to import for usage into the .NET runtime.</param>
        /// <param name="flags">Flags used to describe the external object.</param>
        /// <param name="wrapper">The <see cref="object"/> to be used as the wrapper for the external object</param>
        /// <returns>Returns a managed object associated with the supplied external COM object.</returns>
        /// <remarks>
        /// If the <paramref name="wrapper"/> instance already has an associated external object a <see cref="System.NotSupportedException"/> will be thrown.
        /// </remarks>
        public object GetOrRegisterObjectForComInstance(IntPtr externalComObject, CreateObjectFlags flags, object wrapper)
        {
            if (wrapper == null)
            {
                throw new ArgumentNullException(nameof(externalComObject));
            }

            return(GetOrCreateObjectForComInstanceInternal(externalComObject, flags, wrapper));
        }
示例#8
0
            protected override object?CreateObject(IntPtr externalComObject, CreateObjectFlags flag)
            {
                var    iid = typeof(ITrackerObject).GUID;
                IntPtr iTrackerComObject;
                int    hr = Marshal.QueryInterface(externalComObject, ref iid, out iTrackerComObject);

                Assert.AreEqual(0, hr);

                return(new ITrackerObjectWrapper(iTrackerComObject));
            }
示例#9
0
        /// <summary>
        /// Get the currently registered managed object or creates a new managed object and registers it.
        /// </summary>
        /// <param name="externalComObject">Object to import for usage into the .NET runtime.</param>
        /// <param name="flags">Flags used to describe the external object.</param>
        /// <returns>Returns a managed object associated with the supplied external COM object.</returns>
        public object GetOrCreateObjectForComInstance(IntPtr externalComObject, CreateObjectFlags flags)
        {
            object?obj;

            if (!TryGetOrCreateObjectForComInstanceInternal(this, externalComObject, flags, null, out obj))
            {
                throw new ArgumentNullException();
            }

            return(obj !);
        }
        protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
        {
            // Assert use of the UniqueInstance flag since the returned Native Object Wrapper always
            // supports IDisposable and its Dispose will always release and suppress finalization.
            // If the wrapper doesn't always support IDisposable the assert can be relaxed.
            Debug.Assert(flags.HasFlag(CreateObjectFlags.UniqueInstance));

            // Throw an exception if the type is not supported by the implementation.
            // Null can be returned as well, but an ArgumentNullException will be thrown for
            // the consumer of this ComWrappers instance.
            return(SymNgenWriterWrapper.CreateIfSupported(externalComObject) ?? throw new NotSupportedException());
        }
            protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
            {
                Debug.Assert(flags == CreateObjectFlags.UniqueInstance);

                var iid = ICLRMetaHost.IID;

                if (Marshal.QueryInterface(externalComObject, ref iid, out IntPtr hostPtr) != 0)
                {
                    throw new ArgumentException("Expected ICLRMetaHost COM interface");
                }
                return(new ClrMetaHostRcw(hostPtr));
            }
示例#12
0
 /// <summary>
 /// Get the currently registered managed object or uses the supplied managed object and registers it.
 /// </summary>
 /// <param name="externalComObject">Object to import for usage into the .NET runtime.</param>
 /// <param name="flags">Flags used to describe the external object.</param>
 /// <param name="wrapper">The <see cref="object"/> to be used as the wrapper for the external object</param>
 /// <returns>Returns a managed object associated with the supplied external COM object.</returns>
 /// <remarks>
 /// If the <paramref name="wrapper"/> instance already has an associated external object a <see cref="System.NotSupportedException"/> will be thrown.
 /// </remarks>
 public object GetOrRegisterObjectForComInstance(
     IntPtr externalComObject,
     CreateObjectFlags flags,
     object wrapper
     )
 {
     return(GetOrRegisterObjectForComInstance(
                externalComObject,
                flags,
                wrapper,
                IntPtr.Zero
                ));
 }
示例#13
0
        protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
        {
            // Return NULL works,
            //return null;
            GetIUnknownImpl(out IntPtr fpQueryInteface, out IntPtr fpAddRef, out IntPtr fpRelease);
            if (((IntPtr *)((IntPtr *)externalComObject)[0])[0] == fpQueryInteface)
            {
                return(ComWrappers.ComInterfaceDispatch.GetInstance <object>((ComWrappers.ComInterfaceDispatch *)externalComObject));
            }

            // Return object does not works yet.
            return(new IExternalObject(externalComObject));
        }
示例#14
0
        protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
        {
            Debug.Assert(flags == CreateObjectFlags.UniqueInstance);

            Guid errorInfoIID = IID_IErrorInfo;
            int  hr           = Marshal.QueryInterface(externalComObject, ref errorInfoIID, out IntPtr comObject);

            if (hr == S_OK)
            {
                return(new ErrorInfoWrapper(comObject));
            }

            throw new NotImplementedException();
        }
示例#15
0
        protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
        {
            IObjectReference objRef = ComWrappersSupport.GetObjectReferenceForInterface(externalComObject);

            if (objRef.TryAs <IInspectable.Vftbl>(out var inspectableRef) == 0)
            {
                IInspectable inspectable = new IInspectable(inspectableRef);

                string runtimeClassName = inspectable.GetRuntimeClassName(noThrow: true);

                return(runtimeClassName switch
                {
                    "Windows.Data.Text.WordSegment" => new MS.Internal.WindowsRuntime.Windows.Data.Text.WordSegment(new MS.Internal.WindowsRuntime.ABI.Windows.Data.Text.IWordSegment(objRef)),
                    _ => inspectable
                });
示例#16
0
        protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
        {
            IObjectReference objRef = ComWrappersSupport.GetObjectReferenceForInterface(externalComObject);

            if (objRef.TryAs <IInspectable.Vftbl>(out var inspectableRef) == 0)
            {
                IInspectable inspectable = new IInspectable(inspectableRef);

                string runtimeClassName = inspectable.GetRuntimeClassName(noThrow: true);
                if (runtimeClassName == null)
                {
                    // If the external IInspectable has not implemented GetRuntimeClassName,
                    // we use the Inspectable wrapper directly.
                    return(inspectable);
                }
                return(ComWrappersSupport.GetTypedRcwFactory(runtimeClassName)(inspectable));
            }
示例#17
0
            protected override object?CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
            {
                switch (CreateObjectMode)
                {
                case FailureMode.ReturnInvalid:
                    return(null);

                case FailureMode.ThrowException:
                    throw new Exception()
                          {
                              HResult = ExceptionErrorCode
                          };

                default:
                    Assert.Fail("Invalid failure mode");
                    throw new Exception("UNREACHABLE");
                }
            }
示例#18
0
        // Call to execute the abstract instance function
        internal static object?CallCreateObject(ComWrappers?comWrappersImpl, IntPtr externalComObject, CreateObjectFlags flags)
        {
            ComWrappers?impl = comWrappersImpl ?? s_globalInstance;

            if (impl == null)
            {
                return(null);
            }

            return(impl.CreateObject(externalComObject, flags));
        }
示例#19
0
 protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flag)
 {
     Marshal.AddRef(externalComObject);
     return(new WeakReferencableWrapper(externalComObject));
 }
 protected abstract object?CreateObject(IntPtr externalComObject, CreateObjectFlags flags);
示例#21
0
        /// <summary>
        /// Get the currently registered managed object or creates a new managed object and registers it.
        /// </summary>
        /// <param name="impl">The <see cref="ComWrappers" /> implementation to use when creating the managed object.</param>
        /// <param name="externalComObject">Object to import for usage into the .NET runtime.</param>
        /// <param name="flags">Flags used to describe the external object.</param>
        /// <param name="wrapperMaybe">The <see cref="object"/> to be used as the wrapper for the external object.</param>
        /// <param name="retValue">The managed object associated with the supplied external COM object or <c>null</c> if it could not be created.</param>
        /// <returns>Returns <c>true</c> if a managed object could be retrieved/created, <c>false</c> otherwise</returns>
        /// <remarks>
        /// If <paramref name="impl" /> is <c>null</c>, the global instance (if registered) will be used.
        /// </remarks>
        private static bool TryGetOrCreateObjectForComInstanceInternal(ComWrappers?impl, IntPtr externalComObject, CreateObjectFlags flags, object?wrapperMaybe, out object?retValue)
        {
            if (externalComObject == IntPtr.Zero)
            {
                throw new ArgumentNullException(nameof(externalComObject));
            }

            object?wrapperMaybeLocal = wrapperMaybe;

            retValue = null;
            return(TryGetOrCreateObjectForComInstanceInternal(ObjectHandleOnStack.Create(ref impl), externalComObject, flags, ObjectHandleOnStack.Create(ref wrapperMaybeLocal), ObjectHandleOnStack.Create(ref retValue)));
        }
            protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
            {
                Debug.Assert(flags == CreateObjectFlags.UniqueInstance);

                return(new ClrRuntimeInfoRcw(externalComObject));
            }
示例#23
0
 // Call to execute the abstract instance function
 internal static object?CallCreateObject(ComWrappers?comWrappersImpl, IntPtr externalComObject, CreateObjectFlags flags)
 => (comWrappersImpl ?? s_globalInstance !).CreateObject(externalComObject, flags);
示例#24
0
 /// <summary>
 /// Get the currently registered managed object or creates a new managed object and registers it.
 /// </summary>
 /// <param name="externalComObject">Object to import for usage into the .NET runtime.</param>
 /// <param name="flags">Flags used to describe the external object.</param>
 /// <returns>Returns a managed object associated with the supplied external COM object.</returns>
 public object GetOrCreateObjectForComInstance(IntPtr externalComObject, CreateObjectFlags flags)
 {
     return(GetOrCreateObjectForComInstanceInternal(externalComObject, flags, null));
 }
示例#25
0
        private object GetOrCreateObjectForComInstanceInternal(IntPtr externalComObject, CreateObjectFlags flags, object?wrapperMaybe)
        {
            if (externalComObject == IntPtr.Zero)
            {
                throw new ArgumentNullException(nameof(externalComObject));
            }

            ComWrappers impl = this;
            object?     wrapperMaybeLocal = wrapperMaybe;
            object?     retValue          = null;

            GetOrCreateObjectForComInstanceInternal(ObjectHandleOnStack.Create(ref impl), externalComObject, flags, ObjectHandleOnStack.Create(ref wrapperMaybeLocal), ObjectHandleOnStack.Create(ref retValue));

            return(retValue !);
        }
示例#26
0
 private static extern void GetOrCreateObjectForComInstanceInternal(ObjectHandleOnStack comWrappersImpl, IntPtr externalComObject, CreateObjectFlags flags, ObjectHandleOnStack wrapper, ObjectHandleOnStack retValue);
示例#27
0
 protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flag)
 => throw new NotImplementedException();
示例#28
0
 protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
 {
     // Return NULL works,
     return(null);
 }
 public object GetOrRegisterObjectForComInstance(IntPtr externalComObject, CreateObjectFlags flags, object wrapper)
 {
     throw new PlatformNotSupportedException();
 }
示例#30
0
        protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flags)
        {
            Debug.Assert(flags == CreateObjectFlags.UniqueInstance || flags == CreateObjectFlags.None || flags == CreateObjectFlags.Unwrap);

            Guid pictureIID = IID.IPicture;
            int  hr         = Marshal.QueryInterface(externalComObject, ref pictureIID, out IntPtr pictureComObject);

            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new PictureWrapper(pictureComObject));
            }

            Guid errorInfoIID = IID.IErrorInfo;

            hr = Marshal.QueryInterface(externalComObject, ref errorInfoIID, out IntPtr errorInfoComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new ErrorInfoWrapper(errorInfoComObject));
            }

            Guid enumFormatEtcIID = IID.IEnumFORMATETC;

            hr = Marshal.QueryInterface(externalComObject, ref enumFormatEtcIID, out IntPtr enumFormatEtcComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new EnumFORMATETCWrapper(enumFormatEtcComObject));
            }

            Guid fileOpenDialogIID = IID.IFileOpenDialog;

            hr = Marshal.QueryInterface(externalComObject, ref fileOpenDialogIID, out IntPtr fileOpenDialogComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new FileOpenDialogWrapper(fileOpenDialogComObject));
            }

            Guid fileSaveDialogIID = IID.IFileSaveDialog;

            hr = Marshal.QueryInterface(externalComObject, ref fileSaveDialogIID, out IntPtr fileSaveDialogComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new FileSaveDialogWrapper(fileSaveDialogComObject));
            }

            Guid lockBytesIID = IID.ILockBytes;

            hr = Marshal.QueryInterface(externalComObject, ref lockBytesIID, out IntPtr lockBytesComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new LockBytesWrapper(lockBytesComObject));
            }

            Guid shellItemIID = IID.IShellItem;

            hr = Marshal.QueryInterface(externalComObject, ref shellItemIID, out IntPtr shellItemComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new ShellItemWrapper(shellItemComObject));
            }

            Guid shellItemArrayIID = IID.IShellItemArray;

            hr = Marshal.QueryInterface(externalComObject, ref shellItemArrayIID, out IntPtr shellItemArrayComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new ShellItemArrayWrapper(shellItemArrayComObject));
            }

            Guid autoCompleteIID = IID.IAutoComplete2;

            hr = Marshal.QueryInterface(externalComObject, ref autoCompleteIID, out IntPtr autoCompleteComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new AutoCompleteWrapper(autoCompleteComObject));
            }

            Guid enumVariantIID = IID.IEnumVariant;

            hr = Marshal.QueryInterface(externalComObject, ref enumVariantIID, out IntPtr enumVariantComObject);
            if (hr == S_OK)
            {
                Marshal.Release(externalComObject);
                return(new EnumVariantWrapper(enumVariantComObject));
            }

            throw new NotImplementedException();
        }