public unsafe void IDispatch_Invoke_Invoke_Success() { using var image = new Bitmap(16, 32); IPictureDisp picture = MockAxHost.GetIPictureDispFromPicture(image); IDispatch dispatch = (IDispatch)picture; Guid riid = Guid.Empty; var dispParams = new DISPPARAMS(); var varResult = new object[1]; var excepInfo = new EXCEPINFO(); uint argErr = 0; HRESULT hr = dispatch.Invoke( (DispatchID)4, &riid, Kernel32.GetThreadLocale(), DISPATCH.PROPERTYGET, &dispParams, varResult, &excepInfo, &argErr ); Assert.Equal(HRESULT.S_OK, hr); Assert.Equal(16, GdiHelper.HimetricToPixelY((int)varResult[0])); Assert.Equal(0u, argErr); }
public IEnumerator GetEnumerator() { Variant result; unsafe { void * resultLocal = &result; DISPPARAMS dispParams = new DISPPARAMS(); Guid guid = Guid.Empty; Dispatch.Invoke( DISPID_NEWENUM, ref guid, LCID_DEFAULT, InvokeFlags.DISPATCH_METHOD | InvokeFlags.DISPATCH_PROPERTYGET, ref dispParams, new IntPtr(resultLocal), IntPtr.Zero, IntPtr.Zero); } object resultAsObject = result.ToObject(); if (!(resultAsObject is IEnumVARIANT enumVariant)) { throw new InvalidOperationException(SR.InvalidOp_InvalidNewEnumVariant); } return((IEnumerator)EnumeratorToEnumVariantMarshaler.GetInstance(null).MarshalNativeToManaged(Marshal.GetIUnknownForObject(enumVariant))); }
void ITypeInfo.Invoke(object pvInstance, int memid, short wFlags, ref DISPPARAMS pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, out int puArgErr) { Before("parameters not included"); _wrapper.Invoke(pvInstance, memid, wFlags, ref pDispParams, pVarResult, pExcepInfo, out puArgErr); After("parameters not included"); }
public unsafe void ITypeInfo_Invoke_Invoke_Success() { using var image = new Bitmap(16, 32); IPictureDisp picture = SubAxHost.GetIPictureDispFromPicture(image); IDispatch dispatch = (IDispatch)picture; ITypeInfo typeInfo; HRESULT hr = dispatch.GetTypeInfo(0, Kernel32.GetThreadLocale(), out typeInfo); Assert.Equal(HRESULT.S_OK, hr); var dispParams = new DISPPARAMS(); var varResult = new object[1]; var excepInfo = new EXCEPINFO(); uint argErr = 0; hr = typeInfo.Invoke( picture, (DispatchID)4, DISPATCH.PROPERTYGET, &dispParams, varResult, &excepInfo, &argErr ); Assert.Equal(HRESULT.DISP_E_MEMBERNOTFOUND, hr); Assert.Null(varResult[0]); Assert.Equal(0u, argErr); }
void ComWrappersImpl.IDispatch.Invoke( int dispIdMember, ref Guid riid, int lcid, INVOKEKIND wFlags, ref DISPPARAMS pDispParams, IntPtr VarResult, IntPtr pExcepInfo, IntPtr puArgErr) { MemberInfo?memberInfo; if (!this.dispIdToMemberInfo.TryGetValue(dispIdMember, out memberInfo)) { throw new COMException(null, DISP_E_UNKNOWNNAME); } BindingFlags invokeFlags = BindingFlags.Public | BindingFlags.Instance; if (wFlags.HasFlag(INVOKEKIND.INVOKE_FUNC) && memberInfo.MemberType == MemberTypes.Method) { invokeFlags |= BindingFlags.InvokeMethod; } else { throw new NotImplementedException("Operation not implemented."); } // Use reflection to dispatch to the indicated function. // Note that this is exactly what the internal implementation of IDispatch does so there // isn't a lot of difference in cost. var result = this.objType.InvokeMember( memberInfo.Name, invokeFlags, null, this.obj, MarshalArguments(ref pDispParams)); if (result != null) { // Lots of special cases should be addressed here. // * Arrays, IEnumerable // * IDispatch/IUnknown instances // * .NET object could be wrapped by ComWrappers // * .NET objects that are already COM objects can be safely passed on // * etc Marshal.GetNativeVariantForObject(result, VarResult); } }
private static object[] MarshalArguments(ref DISPPARAMS pDispParams) { if (pDispParams.cArgs == 0) { return(Array.Empty <object>()); } // Lots of special cases should be addressed here. // * Arrays // * IDispatch/IUnknown instances // * .NET objects passed back as arguments // * etc return(Marshal.GetObjectsForNativeVariants(pDispParams.rgvarg, pDispParams.cArgs) !); }
public System.Collections.IEnumerator GetEnumerator() { Variant result; unsafe { void * resultLocal = &result; DISPPARAMS dispParams = default; Guid guid = Guid.Empty; Dispatch.Invoke( DISPID_NEWENUM, ref guid, LCID_DEFAULT, InvokeFlags.DISPATCH_METHOD | InvokeFlags.DISPATCH_PROPERTYGET, ref dispParams, new IntPtr(resultLocal), IntPtr.Zero, IntPtr.Zero ); } Debug.Assert(OperatingSystem.IsWindows()); IntPtr enumVariantPtr = IntPtr.Zero; try { object?resultAsObject = result.ToObject(); if (!(resultAsObject is IEnumVARIANT enumVariant)) { throw new InvalidOperationException(SR.InvalidOp_InvalidNewEnumVariant); } enumVariantPtr = Marshal.GetIUnknownForObject(enumVariant); return((System.Collections.IEnumerator)EnumeratorToEnumVariantMarshaler .GetInstance(null) .MarshalNativeToManaged(enumVariantPtr)); } finally { result.Clear(); if (enumVariantPtr != IntPtr.Zero) { Marshal.Release(enumVariantPtr); } } }
public unsafe void IDispatch_Invoke_Invoke_Success() { using var image = new Bitmap(16, 32); IPictureDisp picture = SubAxHost.GetIPictureDispFromPicture(image); IDispatch dispatch = (IDispatch)picture; Guid riid = Guid.Empty; var dispParams = new DISPPARAMS(); var varResult = new object[1]; var excepInfo = new EXCEPINFO(); uint argErr = 0; HRESULT hr = dispatch.Invoke( (DispatchID)4, &riid, 0, DISPATCH.PROPERTYGET, &dispParams, varResult, &excepInfo, &argErr ); }
public void Invoke(object pvInstance, int memid, short wFlags, ref DISPPARAMS pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, out int puArgErr) { throw new Exception("The method or operation is not implemented."); }