Exemple #1
0
        unsafe void NativeMethods.IDispatch.Invoke(int dispid, ref Guid riid, int lcid, System.Runtime.InteropServices.ComTypes.INVOKEKIND wFlags, ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams, IntPtr pvarResult, IntPtr pExcepInfo, IntPtr puArgErr)
        {
            ComEventsMethod method = this.FindMethod(dispid);

            if (method == null)
            {
                return;
            }
            object[] args       = new object[pDispParams.cArgs];
            int[]    numArray   = new int[pDispParams.cArgs];
            bool[]   flagArray  = new bool[pDispParams.cArgs];
            Variant *variantPtr = (Variant *)(void *)pDispParams.rgvarg;
            int *    numPtr     = (int *)(void *)pDispParams.rgdispidNamedArgs;
            int      index1;

            for (index1 = 0; index1 < pDispParams.cNamedArgs; ++index1)
            {
                int      index2  = numPtr[index1];
                Variant *variant = ComEventsSink.GetVariant(variantPtr + index1);
                args[index2]      = variant->ToObject();
                flagArray[index2] = true;
                numArray[index2]  = !variant->IsByRef ? -1 : index1;
            }
            int index3 = 0;

            for (; index1 < pDispParams.cArgs; ++index1)
            {
                while (flagArray[index3])
                {
                    ++index3;
                }
                Variant *variant = ComEventsSink.GetVariant(variantPtr + (pDispParams.cArgs - 1 - index1));
                args[index3]     = variant->ToObject();
                numArray[index3] = !variant->IsByRef ? -1 : pDispParams.cArgs - 1 - index1;
                ++index3;
            }
            object obj = method.Invoke(args);

            if (pvarResult != IntPtr.Zero)
            {
                Marshal.GetNativeVariantForObject(obj, pvarResult);
            }
            for (int index2 = 0; index2 < pDispParams.cArgs; ++index2)
            {
                int num = numArray[index2];
                if (num != -1)
                {
                    ComEventsSink.GetVariant(variantPtr + num)->CopyFromIndirect(args[index2]);
                }
            }
        }
Exemple #2
0
        unsafe void NativeMethods.IDispatch.Invoke(
            int dispid,
            ref Guid riid,
            int lcid,
            ComTypes.INVOKEKIND wFlags,
            ref ComTypes.DISPPARAMS pDispParams,
            IntPtr pvarResult,
            IntPtr pExcepInfo,
            IntPtr puArgErr)
        {
            ComEventsMethod method = FindMethod(dispid);

            if (method == null)
            {
                return;
            }

            // notice the unsafe pointers we are using. This is to avoid unnecessary
            // arguments marshalling. see code:ComEventsHelper#ComEventsArgsMarshalling

            object [] args      = new object[pDispParams.cArgs];
            int []    byrefsMap = new int[pDispParams.cArgs];
            bool []   usedArgs  = new bool[pDispParams.cArgs];

            Variant *pvars      = (Variant *)pDispParams.rgvarg;
            int *    pNamedArgs = (int *)pDispParams.rgdispidNamedArgs;

            // copy the named args (positional) as specified
            int i;
            int pos;

            for (i = 0; i < pDispParams.cNamedArgs; i++)
            {
                pos = pNamedArgs[i];

                Variant *pvar = GetVariant(&pvars[i]);
                args[pos]     = pvar->ToObject();
                usedArgs[pos] = true;

                if (pvar->IsByRef)
                {
                    byrefsMap[pos] = i;
                }
                else
                {
                    byrefsMap[pos] = -1;
                }
            }

            // copy the rest of the arguments in the reverse order
            pos = 0;
            for (; i < pDispParams.cArgs; i++)
            {
                // find the next unassigned argument
                while (usedArgs[pos])
                {
                    ++pos;
                }

                Variant *pvar = GetVariant(&pvars[pDispParams.cArgs - 1 - i]);
                args[pos] = pvar->ToObject();

                if (pvar->IsByRef)
                {
                    byrefsMap[pos] = pDispParams.cArgs - 1 - i;
                }
                else
                {
                    byrefsMap[pos] = -1;
                }

                pos++;
            }

            // Do the actual delegate invocation
            object result;

            result = method.Invoke(args);

            // convert result to VARIANT
            if (pvarResult != IntPtr.Zero)
            {
                Marshal.GetNativeVariantForObject(result, pvarResult);
            }

            // Now we need to marshal all the byrefs back
            for (i = 0; i < pDispParams.cArgs; i++)
            {
                int idxToPos = byrefsMap[i];
                if (idxToPos == -1)
                {
                    continue;
                }

                GetVariant(&pvars[idxToPos])->CopyFromIndirect(args[i]);
            }
        }
        unsafe void NativeMethods.IDispatch.Invoke(int dispid, ref Guid riid, int lcid, System.Runtime.InteropServices.ComTypes.INVOKEKIND wFlags, ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams, IntPtr pvarResult, IntPtr pExcepInfo, IntPtr puArgErr)
        {
            ComEventsMethod method = this.FindMethod(dispid);

            if (method != null)
            {
                int      num2;
                object[] args      = new object[pDispParams.cArgs];
                int[]    numArray  = new int[pDispParams.cArgs];
                bool[]   flagArray = new bool[pDispParams.cArgs];
                System.Runtime.InteropServices.Variant *rgvarg = (System.Runtime.InteropServices.Variant *)pDispParams.rgvarg;
                int *rgdispidNamedArgs = (int *)pDispParams.rgdispidNamedArgs;
                int  index             = 0;
                while (index < pDispParams.cNamedArgs)
                {
                    num2            = rgdispidNamedArgs[index];
                    args[num2]      = (rgvarg + index).ToObject();
                    flagArray[num2] = true;
                    if ((rgvarg + index).IsByRef)
                    {
                        numArray[num2] = index;
                    }
                    else
                    {
                        numArray[num2] = -1;
                    }
                    index++;
                }
                num2 = 0;
                while (index < pDispParams.cArgs)
                {
                    while (flagArray[num2])
                    {
                        num2++;
                    }
                    System.Runtime.InteropServices.Variant *variantPtr2 = rgvarg + ((pDispParams.cArgs - 1) - index);
                    args[num2] = variantPtr2.ToObject();
                    if (variantPtr2.IsByRef)
                    {
                        numArray[num2] = (pDispParams.cArgs - 1) - index;
                    }
                    else
                    {
                        numArray[num2] = -1;
                    }
                    num2++;
                    index++;
                }
                object obj2 = method.Invoke(args);
                if (pvarResult != IntPtr.Zero)
                {
                    Marshal.GetNativeVariantForObject(obj2, pvarResult);
                }
                for (index = 0; index < pDispParams.cArgs; index++)
                {
                    int num3 = numArray[index];
                    if (num3 != -1)
                    {
                        (rgvarg + num3).CopyFromIndirect(args[index]);
                    }
                }
            }
        }
        unsafe void NativeMethods.IDispatch.Invoke(int dispid, ref Guid riid, int lcid, INVOKEKIND wFlags, ref DISPPARAMS pDispParams, IntPtr pvarResult, IntPtr pExcepInfo, IntPtr puArgErr)
        {
            ComEventsMethod comEventsMethod = this.FindMethod(dispid);

            if (comEventsMethod == null)
            {
                return;
            }
            object[] array  = new object[pDispParams.cArgs];
            int[]    array2 = new int[pDispParams.cArgs];
            bool[]   array3 = new bool[pDispParams.cArgs];
            Variant *ptr    = (Variant *)((void *)pDispParams.rgvarg);
            int *    ptr2   = (int *)((void *)pDispParams.rgdispidNamedArgs);
            int      i;
            int      num;

            for (i = 0; i < pDispParams.cNamedArgs; i++)
            {
                num = ptr2[i];
                Variant *variant = ComEventsSink.GetVariant(ptr + i);
                array[num]  = variant->ToObject();
                array3[num] = true;
                if (variant->IsByRef)
                {
                    array2[num] = i;
                }
                else
                {
                    array2[num] = -1;
                }
            }
            num = 0;
            while (i < pDispParams.cArgs)
            {
                while (array3[num])
                {
                    num++;
                }
                Variant *variant2 = ComEventsSink.GetVariant(ptr + (pDispParams.cArgs - 1 - i));
                array[num] = variant2->ToObject();
                if (variant2->IsByRef)
                {
                    array2[num] = pDispParams.cArgs - 1 - i;
                }
                else
                {
                    array2[num] = -1;
                }
                num++;
                i++;
            }
            object obj = comEventsMethod.Invoke(array);

            if (pvarResult != IntPtr.Zero)
            {
                Marshal.GetNativeVariantForObject(obj, pvarResult);
            }
            for (i = 0; i < pDispParams.cArgs; i++)
            {
                int num2 = array2[i];
                if (num2 != -1)
                {
                    ComEventsSink.GetVariant(ptr + num2)->CopyFromIndirect(array[i]);
                }
            }
        }