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]); } } }
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]); } } }