/// <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) )); }
/// <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 !); }
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); }
// 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)); }
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(); }
private static extern bool TryGetOrCreateObjectForComInstanceInternal( ObjectHandleOnStack comWrappersImpl, long wrapperId, IntPtr externalComObject, IntPtr innerMaybe, CreateObjectFlags flags, ObjectHandleOnStack wrapper, ObjectHandleOnStack retValue );
/// <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)); }
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)); }
/// <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)); }
/// <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 )); }
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)); }
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(); }
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 });
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)); }
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"); } }
// 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)); }
protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flag) { Marshal.AddRef(externalComObject); return(new WeakReferencableWrapper(externalComObject)); }
protected abstract object?CreateObject(IntPtr externalComObject, CreateObjectFlags flags);
/// <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)); }
// Call to execute the abstract instance function internal static object?CallCreateObject(ComWrappers?comWrappersImpl, IntPtr externalComObject, CreateObjectFlags flags) => (comWrappersImpl ?? s_globalInstance !).CreateObject(externalComObject, flags);
/// <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)); }
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 !); }
private static extern void GetOrCreateObjectForComInstanceInternal(ObjectHandleOnStack comWrappersImpl, IntPtr externalComObject, CreateObjectFlags flags, ObjectHandleOnStack wrapper, ObjectHandleOnStack retValue);
protected override object CreateObject(IntPtr externalComObject, CreateObjectFlags flag) => throw new NotImplementedException();
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(); }
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(); }