Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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");
 }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
    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);
        }
    }
Ejemplo n.º 6
0
    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) !);
    }
Ejemplo n.º 7
0
        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);
                }
            }
        }
Ejemplo n.º 8
0
        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
                );
        }
Ejemplo n.º 9
0
 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.");
 }