コード例 #1
0
ファイル: XlCallImpl.cs プロジェクト: zqwght/ExcelDna
        private unsafe static int TryExcelImpl12(int xlFunction, out object result, params object[] parameters)
        {
            int xlReturn;

            // Set up the memory to hold the result from the call
            XlOper12 resultOper = new XlOper12();

            resultOper.xlType = XlType12.XlTypeEmpty;
            XlOper12 *pResultOper = &resultOper;  // No need to pin for local struct

            // Special kind of ObjectArrayMarshaler for the parameters (rank 1)
            using (XlObjectArray12Marshaler.XlObjectArray12MarshalerImpl paramMarshaler
                       = new XlObjectArray12Marshaler.XlObjectArray12MarshalerImpl(1, true))
            {
                XlOper12 **ppOperParameters = (XlOper12 **)paramMarshaler.MarshalManagedToNative(parameters);
                xlReturn = Excel12v(xlFunction, parameters.Length, ppOperParameters, pResultOper);
            }

            // pResultOper now holds the result of the evaluated function
            // Get ObjectMarshaler for the return value
            ICustomMarshaler m = XlObject12Marshaler.GetInstance("");

            result = m.MarshalNativeToManaged((IntPtr)pResultOper);
            // And free any memory allocated by Excel
            Excel12v(xlFree, 1, &pResultOper, (XlOper12 *)IntPtr.Zero);

            return(xlReturn);
        }
コード例 #2
0
        internal static IntPtr XlAddInManagerInfo12(IntPtr pXloperAction12)
        {
            Debug.WriteLine("In XlAddIn.XlAddInManagerInfo12");
            ICustomMarshaler m      = XlObject12Marshaler.GetInstance("");
            object           action = m.MarshalNativeToManaged(pXloperAction12);
            object           result;

            if ((action is double && (double)action == 1.0))
            {
                InitializeIntegration();
                result = IntegrationHelpers.DnaLibraryGetName();
            }
            else
            {
                result = IntegrationMarshalHelpers.GetExcelErrorObject(IntegrationMarshalHelpers.ExcelError_ExcelErrorValue);
            }
            return(m.MarshalManagedToNative(result));
        }
コード例 #3
0
ファイル: XlAddIn.cs プロジェクト: Excel-DNA/exceldna-build
        internal static IntPtr RegistrationInfo(IntPtr pParam)
        {
            if (!_initialized)
            {
                return(IntPtr.Zero);
            }

            // CONSIDER: This might not be the right place for this.
            ICustomMarshaler m       = XlObject12Marshaler.GetInstance("");
            object           param   = m.MarshalNativeToManaged(pParam);
            object           regInfo = XlRegistration.GetRegistrationInfo(param);

            if (regInfo == null)
            {
                return(IntPtr.Zero); // Converted to #NUM
            }

            return(m.MarshalManagedToNative(regInfo));
        }
コード例 #4
0
ファイル: Marshalling.cs プロジェクト: wyrover/DLL-Injector-1
        private void MarshalToManaged(ref object Paramater, object OrigParmater, IntPtr PtrParamater, MarshalAsAttribute Marshalling, Type ParamaterType, ICustomMarshaler CustomMarshaler, CharSet charSet, bool IsByRef)
        {
            if (Marshalling == null)
            {
                return;
            }

            switch (Marshalling.Value)
            {
            case UnmanagedType.AnsiBStr:
                try
                {
                    if (ParamaterType == typeof(StringBuilder))
                    {
                        StringBuilder StrParam = (StringBuilder)OrigParmater;

                        if (IsByRef && StrParam == null)
                        {
                            Paramater = StrParam = new StringBuilder();
                        }

                        if (StrParam == null)
                        {
                            break;
                        }

                        if (PtrParamater == IntPtr.Zero)
                        {
                            StrParam.Clear();
                        }
                        else
                        {
                            this.ReadPrefixedStringAnsi(PtrParamater, StrParam);
                        }
                    }
                    else if (IsByRef && ParamaterType == typeof(string))
                    {
                        if (PtrParamater == IntPtr.Zero)
                        {
                            Paramater = null;
                        }
                        else
                        {
                            Paramater = this.ReadPrefixedStringAnsi(PtrParamater);
                        }
                    }
                }
                finally
                {
                    if (PtrParamater != IntPtr.Zero)
                    {
                        this.FreeMemory(PtrParamater);
                    }
                }
                break;

            case UnmanagedType.Bool:
                if (IsByRef)
                {
                    Paramater = Convert.ToUInt32(Paramater) != 0U;
                }

                break;

            case UnmanagedType.BStr:
                try
                {
                    if (ParamaterType == typeof(StringBuilder))
                    {
                        StringBuilder StrParam = (StringBuilder)OrigParmater;

                        if (IsByRef && StrParam == null)
                        {
                            Paramater = StrParam = new StringBuilder();
                        }

                        if (StrParam == null)
                        {
                            break;
                        }

                        if (PtrParamater == IntPtr.Zero)
                        {
                            StrParam.Clear();
                        }
                        else
                        {
                            this.ReadPrefixedStringUni(PtrParamater, StrParam);
                        }
                    }
                    else if (IsByRef && ParamaterType == typeof(string))
                    {
                        if (PtrParamater == IntPtr.Zero)
                        {
                            Paramater = null;
                        }
                        else
                        {
                            Paramater = this.ReadPrefixedStringUni(PtrParamater);
                        }
                    }
                }
                finally
                {
                    if (PtrParamater != IntPtr.Zero)
                    {
                        this.FreeMemory(PtrParamater);
                    }
                }
                break;

            case UnmanagedType.CustomMarshaler:
                if (CustomMarshaler == null)
                {
                    CustomMarshaler = this.CreateCustomMarshaller(Marshalling);
                }

                try
                {
                    if (IsByRef)
                    {
                        Paramater = CustomMarshaler.MarshalNativeToManaged(PtrParamater);
                    }
                }
                finally
                {
                    CustomMarshaler.CleanUpNativeData(PtrParamater);
                }
                break;

            case UnmanagedType.I1:
            case UnmanagedType.I2:
            case UnmanagedType.I4:
            case UnmanagedType.I8:
            case UnmanagedType.SysInt:
            case UnmanagedType.SysUInt:
            case UnmanagedType.U1:
            case UnmanagedType.U2:
            case UnmanagedType.U4:
            case UnmanagedType.U8:
                if (IsByRef)
                {
                    Paramater = StructToStruct(Paramater, ParamaterType);
                }

                break;

            case UnmanagedType.LPArray:
                try
                {
                    if (PtrParamater == IntPtr.Zero)
                    {
                        Paramater = null;
                    }
                    else
                    {
                        Type  ArrElementType = ParamaterType.GetElementType();
                        Array ArrParam;
                        int   ArrLength = 0;

                        if (IsByRef)
                        {
                            ArrLength = Marshalling.SizeConst;
                            Paramater = ArrParam = Array.CreateInstance(ArrElementType, ArrLength);
                        }
                        else
                        {
                            ArrParam = (Array)OrigParmater;

                            if (ArrParam != null)
                            {
                                ArrLength = ArrParam.Length;
                            }
                        }

                        if (ArrLength > 0)
                        {
                            int bSize = ArrLength * Marshal.SizeOf(ArrElementType);
                            Buffer.BlockCopy(this.ReadBytes(PtrParamater, bSize), 0, ArrParam, 0, bSize);
                        }
                    }
                }
                finally
                {
                    if (PtrParamater != IntPtr.Zero)
                    {
                        this.FreeMemory(PtrParamater);
                    }
                }
                break;

            case UnmanagedType.LPStruct:
                try
                {
                    if (IsByRef && PtrParamater != IntPtr.Zero)
                    {
                        Paramater = this.ReadStruct(PtrParamater, ParamaterType);
                    }
                }
                finally
                {
                    if (PtrParamater != IntPtr.Zero)
                    {
                        this.FreeMemory(PtrParamater);
                    }
                }
                break;

            case UnmanagedType.LPStr:
                try
                {
                    if (ParamaterType == typeof(StringBuilder))
                    {
                        StringBuilder StrParam = (StringBuilder)OrigParmater;

                        if (IsByRef && StrParam == null)
                        {
                            Paramater = StrParam = new StringBuilder();
                        }

                        if (StrParam == null)
                        {
                            break;
                        }

                        if (PtrParamater == IntPtr.Zero)
                        {
                            StrParam.Clear();
                        }
                        else
                        {
                            this.ReadStringAnsi(PtrParamater, StrParam);
                        }
                    }
                    else if (IsByRef && ParamaterType == typeof(string))
                    {
                        if (PtrParamater == IntPtr.Zero)
                        {
                            Paramater = null;
                        }
                        else
                        {
                            Paramater = this.ReadStringAnsi(PtrParamater);
                        }
                    }
                }
                finally
                {
                    if (PtrParamater != IntPtr.Zero)
                    {
                        this.FreeMemory(PtrParamater);
                    }
                }
                break;

            case UnmanagedType.LPTStr:
                if (charSet == CharSet.Ansi || charSet == CharSet.None)
                {
                    goto case UnmanagedType.LPStr;
                }
                else if (charSet == CharSet.Auto || charSet == CharSet.Unicode)
                {
                    goto case UnmanagedType.LPWStr;
                }
                else
                {
                    throw new NotSupportedException();
                }

            case UnmanagedType.LPWStr:
                try
                {
                    if (ParamaterType == typeof(StringBuilder))
                    {
                        StringBuilder StrParam = (StringBuilder)OrigParmater;

                        if (IsByRef && StrParam == null)
                        {
                            Paramater = StrParam = new StringBuilder();
                        }

                        if (StrParam == null)
                        {
                            break;
                        }

                        if (PtrParamater == IntPtr.Zero)
                        {
                            StrParam.Clear();
                        }
                        else
                        {
                            this.ReadStringUni(PtrParamater, StrParam);
                        }
                    }
                    else if (IsByRef && ParamaterType == typeof(string))
                    {
                        if (PtrParamater == IntPtr.Zero)
                        {
                            Paramater = null;
                        }
                        else
                        {
                            Paramater = this.ReadStringUni(PtrParamater);
                        }
                    }
                }
                finally
                {
                    if (PtrParamater != IntPtr.Zero)
                    {
                        this.FreeMemory(PtrParamater);
                    }
                }
                break;

            case UnmanagedType.TBStr:
                if (charSet == CharSet.Ansi || charSet == CharSet.None)
                {
                    goto case UnmanagedType.AnsiBStr;
                }
                else if (charSet == CharSet.Auto || charSet == CharSet.Unicode)
                {
                    goto case UnmanagedType.BStr;
                }
                else
                {
                    throw new NotSupportedException();
                }

            case UnmanagedType.VariantBool:
                if (IsByRef)
                {
                    Paramater = Convert.ToInt16(Paramater) == -1;
                }

                break;
            }
        }