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