#region copyright //------------------------------------------------------------------------------ // 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 // 此代码版权(除特别声明外的代码)归作者本人Diego所有 // 源代码使用协议遵循本仓库的开源协议及附加协议 // Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway // Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway // 使用文档:https://diego2098.gitee.io/thingsgateway-docs/ // QQ群:605534569 //------------------------------------------------------------------------------ #endregion using System.Collections; using System.Reflection; using System.Runtime.InteropServices; using System.Xml; namespace ThingsGateway.Foundation.Adapter.OPCDA.Rcw; #pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 public class Interop { public static PropertyID GetPropertyID(int input) { foreach (FieldInfo field in typeof(Property).GetFields(BindingFlags.Static | BindingFlags.Public)) { PropertyID propertyId = (PropertyID)field.GetValue((object)typeof(PropertyID)); if (input == propertyId.Code) return propertyId; } return new PropertyID(input); } internal static BrowseElement GetBrowseElement(IntPtr pInput, bool deallocate) { BrowseElement browseElement = (BrowseElement)null; if (pInput != IntPtr.Zero) { OPCBROWSEELEMENT structure = (OPCBROWSEELEMENT)Marshal.PtrToStructure(pInput, typeof(OPCBROWSEELEMENT)); browseElement = new BrowseElement(); browseElement.Name = structure.szName; browseElement.ItemPath = (string)null; browseElement.ItemName = structure.szItemID; browseElement.IsItem = (structure.dwFlagValue & 2) != 0; browseElement.HasChildren = (structure.dwFlagValue & 1) != 0; browseElement.Properties = Interop.GetItemProperties(ref structure.ItemProperties, deallocate); if (deallocate) Marshal.DestroyStructure(pInput, typeof(OPCBROWSEELEMENT)); } return browseElement; } internal static OPCBROWSEELEMENT GetBrowseElement( BrowseElement input, bool propertiesRequested) { OPCBROWSEELEMENT browseElement = new OPCBROWSEELEMENT(); if (input != null) { browseElement.szName = input.Name; browseElement.szItemID = input.ItemName; browseElement.dwFlagValue = 0; browseElement.ItemProperties = Interop.GetItemProperties(input.Properties); if (input.IsItem) browseElement.dwFlagValue |= 2; if (input.HasChildren) browseElement.dwFlagValue |= 1; } return browseElement; } internal static BrowseElement[] GetBrowseElements( ref IntPtr pInput, int count, bool deallocate) { BrowseElement[] browseElements = (BrowseElement[])null; if (pInput != IntPtr.Zero && count > 0) { browseElements = new BrowseElement[count]; IntPtr pInput1 = pInput; for (int index = 0; index < count; ++index) { browseElements[index] = Interop.GetBrowseElement(pInput1, deallocate); pInput1 = (IntPtr)(pInput1.ToInt64() + (long)Marshal.SizeOf(typeof(OPCBROWSEELEMENT))); } if (deallocate) { Marshal.FreeCoTaskMem(pInput); pInput = IntPtr.Zero; } } return browseElements; } internal static IntPtr GetBrowseElements(BrowseElement[] input, bool propertiesRequested) { IntPtr browseElements = IntPtr.Zero; if (input != null && input.Length != 0) { browseElements = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(OPCBROWSEELEMENT)) * input.Length); IntPtr ptr = browseElements; for (int index = 0; index < input.Length; ++index) { Marshal.StructureToPtr((object)Interop.GetBrowseElement(input[index], propertiesRequested), ptr, false); ptr = (IntPtr)(ptr.ToInt64() + (long)Marshal.SizeOf(typeof(OPCBROWSEELEMENT))); } } return browseElements; } internal static ItemProperty[] GetItemProperties( ref OPCITEMPROPERTIES input, bool deallocate) { ItemProperty[] itemProperties = (ItemProperty[])null; if (input.dwNumProperties > 0) { itemProperties = new ItemProperty[input.dwNumProperties]; IntPtr pInput = input.pItemProperties; for (int index = 0; index < itemProperties.Length; ++index) { try { itemProperties[index] = Interop.GetItemProperty(pInput, deallocate); } catch (Exception ex) { itemProperties[index] = new ItemProperty(); itemProperties[index].Description = ex.Message; itemProperties[index].ResultID = ResultID.E_FAIL; } pInput = (IntPtr)(pInput.ToInt64() + (long)Marshal.SizeOf(typeof(OPCITEMPROPERTY))); } if (deallocate) { Marshal.FreeCoTaskMem(input.pItemProperties); input.pItemProperties = IntPtr.Zero; } } return itemProperties; } internal static OPCITEMPROPERTIES GetItemProperties(ItemProperty[] input) { OPCITEMPROPERTIES itemProperties = new OPCITEMPROPERTIES(); if (input != null && input.Length != 0) { itemProperties.hrErrorID = 0; itemProperties.dwReserved = 0; itemProperties.dwNumProperties = input.Length; itemProperties.pItemProperties = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(OPCITEMPROPERTY)) * input.Length); bool flag = false; IntPtr ptr = itemProperties.pItemProperties; for (int index = 0; index < input.Length; ++index) { Marshal.StructureToPtr((object)Interop.GetItemProperty(input[index]), ptr, false); ptr = (IntPtr)(ptr.ToInt64() + (long)Marshal.SizeOf(typeof(OPCITEMPROPERTY))); if (input[index].ResultID.Failed()) flag = true; } if (flag) itemProperties.hrErrorID = 1; } return itemProperties; } internal static ItemProperty GetItemProperty(IntPtr pInput, bool deallocate) { ItemProperty itemProperty = (ItemProperty)null; if (pInput != IntPtr.Zero) { OPCITEMPROPERTY structure = (OPCITEMPROPERTY)Marshal.PtrToStructure(pInput, typeof(OPCITEMPROPERTY)); itemProperty = new ItemProperty() { ID = Interop.GetPropertyID(structure.dwPropertyID), Description = structure.szDescription, DataType = Interop.GetType((VarEnum)structure.vtDataType), ItemPath = (string)null, ItemName = structure.szItemID }; itemProperty.Value = Interop.UnmarshalPropertyValue(itemProperty.ID, structure.vValue); itemProperty.ResultID = Interop.GetResultID(structure.hrErrorID); if (structure.hrErrorID == -1073479674) itemProperty.ResultID = new ResultID(ResultID.Da.E_WRITEONLY, -1073479674L); if (deallocate) Marshal.DestroyStructure(pInput, typeof(OPCITEMPROPERTY)); } return itemProperty; } internal static OPCITEMPROPERTY GetItemProperty(ItemProperty input) { OPCITEMPROPERTY itemProperty = new OPCITEMPROPERTY(); if (input != null) { itemProperty.dwPropertyID = input.ID.Code; itemProperty.szDescription = input.Description; itemProperty.vtDataType = (short)Interop.GetType(input.DataType); itemProperty.vValue = Interop.MarshalPropertyValue(input.ID, input.Value); itemProperty.wReserved = (short)0; itemProperty.hrErrorID = Interop.GetResultID(input.ResultID); PropertyDescription propertyDescription = PropertyDescription.Find(input.ID); if (propertyDescription != null) itemProperty.vtDataType = (short)Interop.GetType(propertyDescription.Type); if (input.ResultID == ResultID.Da.E_WRITEONLY) itemProperty.hrErrorID = -1073479674; } return itemProperty; } internal static int[] GetPropertyIDs(PropertyID[] propertyIDs) { ArrayList arrayList = new ArrayList(); if (propertyIDs != null) { foreach (PropertyID propertyId in propertyIDs) arrayList.Add((object)propertyId.Code); } return (int[])arrayList.ToArray(typeof(int)); } internal static ResultID GetResultID(int input) { switch (input) { case -2147467262: return new ResultID(ResultID.E_NOTSUPPORTED, (long)input); case -2147467259: return new ResultID(ResultID.E_FAIL, (long)input); case -2147352571: return new ResultID(ResultID.Da.E_BADTYPE, (long)input); case -2147352566: return new ResultID(ResultID.Da.E_RANGE, (long)input); case -2147217401: return new ResultID(ResultID.Hda.W_NOFILTER, (long)input); case -2147024882: return new ResultID(ResultID.E_OUTOFMEMORY, (long)input); case -2147024809: return new ResultID(ResultID.E_INVALIDARG, (long)input); case -1073479679: return new ResultID(ResultID.Da.E_INVALIDHANDLE, (long)input); case -1073479676: return new ResultID(ResultID.Da.E_BADTYPE, (long)input); case -1073479673: return new ResultID(ResultID.Da.E_UNKNOWN_ITEM_NAME, (long)input); case -1073479672: return new ResultID(ResultID.Da.E_INVALID_ITEM_NAME, (long)input); case -1073479671: return new ResultID(ResultID.Da.E_INVALID_FILTER, (long)input); case -1073479670: return new ResultID(ResultID.Da.E_UNKNOWN_ITEM_PATH, (long)input); case -1073479669: return new ResultID(ResultID.Da.E_RANGE, (long)input); case -1073479165: return new ResultID(ResultID.Da.E_INVALID_PID, (long)input); case -1073479164: return new ResultID(ResultID.Ae.E_INVALIDTIME, (long)input); case -1073479163: return new ResultID(ResultID.Ae.E_BUSY, (long)input); case -1073479162: return new ResultID(ResultID.Ae.E_NOINFO, (long)input); case -1073478655: return new ResultID(ResultID.Da.E_NO_ITEM_DEADBAND, (long)input); case -1073478654: return new ResultID(ResultID.Da.E_NO_ITEM_BUFFERING, (long)input); case -1073478653: return new ResultID(ResultID.Da.E_INVALIDCONTINUATIONPOINT, (long)input); case -1073478650: return new ResultID(ResultID.Da.E_NO_WRITEQT, (long)input); case -1073478649: return new ResultID(ResultID.Cpx.E_TYPE_CHANGED, (long)input); case -1073478648: return new ResultID(ResultID.Cpx.E_FILTER_DUPLICATE, (long)input); case -1073478647: return new ResultID(ResultID.Cpx.E_FILTER_INVALID, (long)input); case -1073478646: return new ResultID(ResultID.Cpx.E_FILTER_ERROR, (long)input); case -1073477888: return new ResultID(ResultID.Dx.E_PERSISTING, (long)input); case -1073477887: return new ResultID(ResultID.Dx.E_NOITEMLIST, (long)input); case -1073477886: return new ResultID(ResultID.Dx.E_VERSION_MISMATCH, (long)input); case -1073477885: return new ResultID(ResultID.Dx.E_VERSION_MISMATCH, (long)input); case -1073477884: return new ResultID(ResultID.Dx.E_UNKNOWN_ITEM_PATH, (long)input); case -1073477883: return new ResultID(ResultID.Dx.E_UNKNOWN_ITEM_NAME, (long)input); case -1073477882: return new ResultID(ResultID.Dx.E_INVALID_ITEM_PATH, (long)input); case -1073477881: return new ResultID(ResultID.Dx.E_INVALID_ITEM_NAME, (long)input); case -1073477880: return new ResultID(ResultID.Dx.E_INVALID_NAME, (long)input); case -1073477879: return new ResultID(ResultID.Dx.E_DUPLICATE_NAME, (long)input); case -1073477878: return new ResultID(ResultID.Dx.E_INVALID_BROWSE_PATH, (long)input); case -1073477877: return new ResultID(ResultID.Dx.E_INVALID_SERVER_URL, (long)input); case -1073477876: return new ResultID(ResultID.Dx.E_INVALID_SERVER_TYPE, (long)input); case -1073477875: return new ResultID(ResultID.Dx.E_UNSUPPORTED_SERVER_TYPE, (long)input); case -1073477874: return new ResultID(ResultID.Dx.E_CONNECTIONS_EXIST, (long)input); case -1073477873: return new ResultID(ResultID.Dx.E_TOO_MANY_CONNECTIONS, (long)input); case -1073477872: return new ResultID(ResultID.Dx.E_OVERRIDE_BADTYPE, (long)input); case -1073477871: return new ResultID(ResultID.Dx.E_OVERRIDE_RANGE, (long)input); case -1073477870: return new ResultID(ResultID.Dx.E_SUBSTITUTE_BADTYPE, (long)input); case -1073477869: return new ResultID(ResultID.Dx.E_SUBSTITUTE_RANGE, (long)input); case -1073477868: return new ResultID(ResultID.Dx.E_INVALID_TARGET_ITEM, (long)input); case -1073477867: return new ResultID(ResultID.Dx.E_UNKNOWN_TARGET_ITEM, (long)input); case -1073477866: return new ResultID(ResultID.Dx.E_TARGET_ALREADY_CONNECTED, (long)input); case -1073477865: return new ResultID(ResultID.Dx.E_UNKNOWN_SERVER_NAME, (long)input); case -1073477864: return new ResultID(ResultID.Dx.E_UNKNOWN_SOURCE_ITEM, (long)input); case -1073477863: return new ResultID(ResultID.Dx.E_INVALID_SOURCE_ITEM, (long)input); case -1073477862: return new ResultID(ResultID.Dx.E_INVALID_QUEUE_SIZE, (long)input); case -1073477861: return new ResultID(ResultID.Dx.E_INVALID_DEADBAND, (long)input); case -1073477860: return new ResultID(ResultID.Dx.E_INVALID_CONFIG_FILE, (long)input); case -1073477859: return new ResultID(ResultID.Dx.E_PERSIST_FAILED, (long)input); case -1073477858: return new ResultID(ResultID.Dx.E_TARGET_FAULT, (long)input); case -1073477857: return new ResultID(ResultID.Dx.E_TARGET_NO_ACCESSS, (long)input); case -1073477856: return new ResultID(ResultID.Dx.E_SOURCE_SERVER_FAULT, (long)input); case -1073477855: return new ResultID(ResultID.Dx.E_SOURCE_SERVER_NO_ACCESSS, (long)input); case -1073477854: return new ResultID(ResultID.Dx.E_SUBSCRIPTION_FAULT, (long)input); case -1073477853: return new ResultID(ResultID.Dx.E_SOURCE_ITEM_BADRIGHTS, (long)input); case -1073477852: return new ResultID(ResultID.Dx.E_SOURCE_ITEM_BAD_QUALITY, (long)input); case -1073477851: return new ResultID(ResultID.Dx.E_SOURCE_ITEM_BADTYPE, (long)input); case -1073477850: return new ResultID(ResultID.Dx.E_SOURCE_ITEM_RANGE, (long)input); case -1073477849: return new ResultID(ResultID.Dx.E_SOURCE_SERVER_NOT_CONNECTED, (long)input); case -1073477848: return new ResultID(ResultID.Dx.E_SOURCE_SERVER_TIMEOUT, (long)input); case -1073477847: return new ResultID(ResultID.Dx.E_TARGET_ITEM_DISCONNECTED, (long)input); case -1073477846: return new ResultID(ResultID.Dx.E_TARGET_NO_WRITES_ATTEMPTED, (long)input); case -1073477845: return new ResultID(ResultID.Dx.E_TARGET_ITEM_BADTYPE, (long)input); case -1073477844: return new ResultID(ResultID.Dx.E_TARGET_ITEM_RANGE, (long)input); case -1073475583: return new ResultID(ResultID.Hda.E_MAXEXCEEDED, (long)input); case -1073475580: return new ResultID(ResultID.Hda.E_INVALIDAGGREGATE, (long)input); case -1073475576: return new ResultID(ResultID.Hda.E_UNKNOWNATTRID, (long)input); case -1073475575: return new ResultID(ResultID.Hda.E_NOT_AVAIL, (long)input); case -1073475574: return new ResultID(ResultID.Hda.E_INVALIDDATATYPE, (long)input); case -1073475573: return new ResultID(ResultID.Hda.E_DATAEXISTS, (long)input); case -1073475572: return new ResultID(ResultID.Hda.E_INVALIDATTRID, (long)input); case -1073475571: return new ResultID(ResultID.Hda.E_NODATAEXISTS, (long)input); case 0: return new ResultID(ResultID.S_OK, (long)input); case 262157: return new ResultID(ResultID.Da.S_UNSUPPORTEDRATE, (long)input); case 262158: return new ResultID(ResultID.Da.S_CLAMP, (long)input); case 262656: return new ResultID(ResultID.Ae.S_ALREADYACKED, (long)input); case 262657: return new ResultID(ResultID.Ae.S_INVALIDBUFFERTIME, (long)input); case 262658: return new ResultID(ResultID.Ae.S_INVALIDMAXSIZE, (long)input); case 262659: return new ResultID(ResultID.Ae.S_INVALIDKEEPALIVETIME, (long)input); case 263172: return new ResultID(ResultID.Da.S_DATAQUEUEOVERFLOW, (long)input); case 263179: return new ResultID(ResultID.Cpx.S_FILTER_NO_DATA, (long)input); case 264064: return new ResultID(ResultID.Dx.S_TARGET_SUBSTITUTED, (long)input); case 264065: return new ResultID(ResultID.Dx.S_TARGET_OVERRIDEN, (long)input); case 264066: return new ResultID(ResultID.Dx.S_CLAMP, (long)input); case 1074008066: return new ResultID(ResultID.Hda.S_NODATA, (long)input); case 1074008067: return new ResultID(ResultID.Hda.S_MOREDATA, (long)input); case 1074008069: return new ResultID(ResultID.Hda.S_CURRENTVALUE, (long)input); case 1074008070: return new ResultID(ResultID.Hda.S_EXTRADATA, (long)input); case 1074008078: return new ResultID(ResultID.Hda.S_INSERTED, (long)input); case 1074008079: return new ResultID(ResultID.Hda.S_REPLACED, (long)input); default: if ((input & 2147418112) == 65536) return new ResultID(ResultID.E_NETWORK_ERROR, (long)input); return input >= 0 ? new ResultID(ResultID.S_FALSE, (long)input) : new ResultID(ResultID.E_FAIL, (long)input); } } internal static int GetResultID(ResultID input) { if (input.Name != (XmlQualifiedName)null && input.Name.Namespace == "http://opcfoundation.org/DataAccess/") { if (input == ResultID.S_OK) return 0; if (input == ResultID.E_FAIL) return -2147467259; if (input == ResultID.E_INVALIDARG) return -2147024809; if (input == ResultID.Da.E_BADTYPE) return -1073479676; if (input == ResultID.Da.E_READONLY || input == ResultID.Da.E_WRITEONLY) return -1073479674; if (input == ResultID.Da.E_RANGE) return -1073479669; if (input == ResultID.E_OUTOFMEMORY) return -2147024882; if (input == ResultID.E_NOTSUPPORTED) return -2147467262; if (input == ResultID.Da.E_INVALIDHANDLE) return -1073479679; if (input == ResultID.Da.E_UNKNOWN_ITEM_NAME) return -1073479673; if (input == ResultID.Da.E_INVALID_ITEM_NAME || input == ResultID.Da.E_INVALID_ITEM_PATH) return -1073479672; if (input == ResultID.Da.E_UNKNOWN_ITEM_PATH) return -1073479670; if (input == ResultID.Da.E_INVALID_FILTER) return -1073479671; if (input == ResultID.Da.S_UNSUPPORTEDRATE) return 262157; if (input == ResultID.Da.S_CLAMP) return 262158; if (input == ResultID.Da.E_INVALID_PID) return -1073479165; if (input == ResultID.Da.E_NO_ITEM_DEADBAND) return -1073478655; if (input == ResultID.Da.E_NO_ITEM_BUFFERING) return -1073478654; if (input == ResultID.Da.E_NO_WRITEQT) return -1073478650; if (input == ResultID.Da.E_INVALIDCONTINUATIONPOINT) return -1073478653; if (input == ResultID.Da.S_DATAQUEUEOVERFLOW) return 263172; } else if (input.Name != (XmlQualifiedName)null && input.Name.Namespace == "http://opcfoundation.org/ComplexData/") { if (input == ResultID.Cpx.E_TYPE_CHANGED) return -1073478649; if (input == ResultID.Cpx.E_FILTER_DUPLICATE) return -1073478648; if (input == ResultID.Cpx.E_FILTER_INVALID) return -1073478647; if (input == ResultID.Cpx.E_FILTER_ERROR) return -1073478646; if (input == ResultID.Cpx.S_FILTER_NO_DATA) return 263179; } else if (input.Name != (XmlQualifiedName)null && input.Name.Namespace == "http://opcfoundation.org/HistoricalDataAccess/") { if (input == ResultID.Hda.E_MAXEXCEEDED) return -1073475583; if (input == ResultID.Hda.S_NODATA) return 1074008066; if (input == ResultID.Hda.S_MOREDATA) return 1074008067; if (input == ResultID.Hda.E_INVALIDAGGREGATE) return -1073475580; if (input == ResultID.Hda.S_CURRENTVALUE) return 1074008069; if (input == ResultID.Hda.S_EXTRADATA) return 1074008070; if (input == ResultID.Hda.E_UNKNOWNATTRID) return -1073475576; if (input == ResultID.Hda.E_NOT_AVAIL) return -1073475575; if (input == ResultID.Hda.E_INVALIDDATATYPE) return -1073475574; if (input == ResultID.Hda.E_DATAEXISTS) return -1073475573; if (input == ResultID.Hda.E_INVALIDATTRID) return -1073475572; if (input == ResultID.Hda.E_NODATAEXISTS) return -1073475571; if (input == ResultID.Hda.S_INSERTED) return 1074008078; if (input == ResultID.Hda.S_REPLACED) return 1074008079; } if (input.Name != (XmlQualifiedName)null && input.Name.Namespace == "http://opcfoundation.org/DataExchange/") { if (input == ResultID.Dx.E_PERSISTING) return -1073477888; if (input == ResultID.Dx.E_NOITEMLIST) return -1073477887; if (input == ResultID.Dx.E_SERVER_STATE || input == ResultID.Dx.E_VERSION_MISMATCH) return -1073477885; if (input == ResultID.Dx.E_UNKNOWN_ITEM_PATH) return -1073477884; if (input == ResultID.Dx.E_UNKNOWN_ITEM_NAME) return -1073477883; if (input == ResultID.Dx.E_INVALID_ITEM_PATH) return -1073477882; if (input == ResultID.Dx.E_INVALID_ITEM_NAME) return -1073477881; if (input == ResultID.Dx.E_INVALID_NAME) return -1073477880; if (input == ResultID.Dx.E_DUPLICATE_NAME) return -1073477879; if (input == ResultID.Dx.E_INVALID_BROWSE_PATH) return -1073477878; if (input == ResultID.Dx.E_INVALID_SERVER_URL) return -1073477877; if (input == ResultID.Dx.E_INVALID_SERVER_TYPE) return -1073477876; if (input == ResultID.Dx.E_UNSUPPORTED_SERVER_TYPE) return -1073477875; if (input == ResultID.Dx.E_CONNECTIONS_EXIST) return -1073477874; if (input == ResultID.Dx.E_TOO_MANY_CONNECTIONS) return -1073477873; if (input == ResultID.Dx.E_OVERRIDE_BADTYPE) return -1073477872; if (input == ResultID.Dx.E_OVERRIDE_RANGE) return -1073477871; if (input == ResultID.Dx.E_SUBSTITUTE_BADTYPE) return -1073477870; if (input == ResultID.Dx.E_SUBSTITUTE_RANGE) return -1073477869; if (input == ResultID.Dx.E_INVALID_TARGET_ITEM) return -1073477868; if (input == ResultID.Dx.E_UNKNOWN_TARGET_ITEM) return -1073477867; if (input == ResultID.Dx.E_TARGET_ALREADY_CONNECTED) return -1073477866; if (input == ResultID.Dx.E_UNKNOWN_SERVER_NAME) return -1073477865; if (input == ResultID.Dx.E_UNKNOWN_SOURCE_ITEM) return -1073477864; if (input == ResultID.Dx.E_INVALID_SOURCE_ITEM) return -1073477863; if (input == ResultID.Dx.E_INVALID_QUEUE_SIZE) return -1073477862; if (input == ResultID.Dx.E_INVALID_DEADBAND) return -1073477861; if (input == ResultID.Dx.E_INVALID_CONFIG_FILE) return -1073477860; if (input == ResultID.Dx.E_PERSIST_FAILED) return -1073477859; if (input == ResultID.Dx.E_TARGET_FAULT) return -1073477858; if (input == ResultID.Dx.E_TARGET_NO_ACCESSS) return -1073477857; if (input == ResultID.Dx.E_SOURCE_SERVER_FAULT) return -1073477856; if (input == ResultID.Dx.E_SOURCE_SERVER_NO_ACCESSS) return -1073477855; if (input == ResultID.Dx.E_SUBSCRIPTION_FAULT) return -1073477854; if (input == ResultID.Dx.E_SOURCE_ITEM_BADRIGHTS) return -1073477853; if (input == ResultID.Dx.E_SOURCE_ITEM_BAD_QUALITY) return -1073477852; if (input == ResultID.Dx.E_SOURCE_ITEM_BADTYPE) return -1073477851; if (input == ResultID.Dx.E_SOURCE_ITEM_RANGE) return -1073477850; if (input == ResultID.Dx.E_SOURCE_SERVER_NOT_CONNECTED) return -1073477849; if (input == ResultID.Dx.E_SOURCE_SERVER_TIMEOUT) return -1073477848; if (input == ResultID.Dx.E_TARGET_ITEM_DISCONNECTED) return -1073477847; if (input == ResultID.Dx.E_TARGET_NO_WRITES_ATTEMPTED) return -1073477846; if (input == ResultID.Dx.E_TARGET_ITEM_BADTYPE) return -1073477845; if (input == ResultID.Dx.E_TARGET_ITEM_RANGE) return -1073477844; if (input == ResultID.Dx.S_TARGET_SUBSTITUTED) return 264064; if (input == ResultID.Dx.S_TARGET_OVERRIDEN) return 264065; if (input == ResultID.Dx.S_CLAMP) return 264066; } else if (input.Code == -1) return input.Succeeded() ? 1 : -2147467259; return input.Code; } internal static VarEnum GetType(System.Type input) { if (input == (System.Type)null) return VarEnum.VT_EMPTY; if (input == typeof(sbyte)) return VarEnum.VT_I1; if (input == typeof(byte)) return VarEnum.VT_UI1; if (input == typeof(short)) return VarEnum.VT_I2; if (input == typeof(ushort)) return VarEnum.VT_UI2; if (input == typeof(int)) return VarEnum.VT_I4; if (input == typeof(uint)) return VarEnum.VT_UI4; if (input == typeof(long)) return VarEnum.VT_I8; if (input == typeof(ulong)) return VarEnum.VT_UI8; if (input == typeof(float)) return VarEnum.VT_R4; if (input == typeof(double)) return VarEnum.VT_R8; if (input == typeof(Decimal)) return VarEnum.VT_CY; if (input == typeof(bool)) return VarEnum.VT_BOOL; if (input == typeof(DateTime)) return VarEnum.VT_DATE; if (input == typeof(string)) return VarEnum.VT_BSTR; if (input == typeof(object)) return VarEnum.VT_EMPTY; if (input == typeof(sbyte[])) return VarEnum.VT_I1 | VarEnum.VT_ARRAY; if (input == typeof(byte[])) return VarEnum.VT_UI1 | VarEnum.VT_ARRAY; if (input == typeof(short[])) return VarEnum.VT_I2 | VarEnum.VT_ARRAY; if (input == typeof(ushort[])) return VarEnum.VT_UI2 | VarEnum.VT_ARRAY; if (input == typeof(int[])) return VarEnum.VT_I4 | VarEnum.VT_ARRAY; if (input == typeof(uint[])) return VarEnum.VT_UI4 | VarEnum.VT_ARRAY; if (input == typeof(long[])) return VarEnum.VT_I8 | VarEnum.VT_ARRAY; if (input == typeof(ulong[])) return VarEnum.VT_UI8 | VarEnum.VT_ARRAY; if (input == typeof(float[])) return VarEnum.VT_R4 | VarEnum.VT_ARRAY; if (input == typeof(double[])) return VarEnum.VT_R8 | VarEnum.VT_ARRAY; if (input == typeof(Decimal[])) return VarEnum.VT_CY | VarEnum.VT_ARRAY; if (input == typeof(bool[])) return VarEnum.VT_BOOL | VarEnum.VT_ARRAY; if (input == typeof(DateTime[])) return VarEnum.VT_DATE | VarEnum.VT_ARRAY; if (input == typeof(string[])) return VarEnum.VT_BSTR | VarEnum.VT_ARRAY; if (input == typeof(object[])) return VarEnum.VT_VARIANT | VarEnum.VT_ARRAY; if (input == Type.ILLEGAL_TYPE) return (VarEnum)System.Enum.ToObject(typeof(VarEnum), (int)short.MaxValue); if (input == typeof(System.Type) || input == typeof(Quality)) return VarEnum.VT_I2; return input == typeof(accessRights) || input == typeof(euType) ? VarEnum.VT_I4 : VarEnum.VT_EMPTY; } internal static System.Type GetType(VarEnum input) { switch (input) { case VarEnum.VT_EMPTY: return (System.Type)null; case VarEnum.VT_I2: return typeof(short); case VarEnum.VT_I4: return typeof(int); case VarEnum.VT_R4: return typeof(float); case VarEnum.VT_R8: return typeof(double); case VarEnum.VT_CY: return typeof(Decimal); case VarEnum.VT_DATE: return typeof(DateTime); case VarEnum.VT_BSTR: return typeof(string); case VarEnum.VT_BOOL: return typeof(bool); case VarEnum.VT_I1: return typeof(sbyte); case VarEnum.VT_UI1: return typeof(byte); case VarEnum.VT_UI2: return typeof(ushort); case VarEnum.VT_UI4: return typeof(uint); case VarEnum.VT_I8: return typeof(long); case VarEnum.VT_UI8: return typeof(ulong); case VarEnum.VT_I2 | VarEnum.VT_ARRAY: return typeof(short[]); case VarEnum.VT_I4 | VarEnum.VT_ARRAY: return typeof(int[]); case VarEnum.VT_R4 | VarEnum.VT_ARRAY: return typeof(float[]); case VarEnum.VT_R8 | VarEnum.VT_ARRAY: return typeof(double[]); case VarEnum.VT_CY | VarEnum.VT_ARRAY: return typeof(Decimal[]); case VarEnum.VT_DATE | VarEnum.VT_ARRAY: return typeof(DateTime[]); case VarEnum.VT_BSTR | VarEnum.VT_ARRAY: return typeof(string[]); case VarEnum.VT_BOOL | VarEnum.VT_ARRAY: return typeof(bool[]); case VarEnum.VT_VARIANT | VarEnum.VT_ARRAY: return typeof(object[]); case VarEnum.VT_I1 | VarEnum.VT_ARRAY: return typeof(sbyte[]); case VarEnum.VT_UI1 | VarEnum.VT_ARRAY: return typeof(byte[]); case VarEnum.VT_UI2 | VarEnum.VT_ARRAY: return typeof(ushort[]); case VarEnum.VT_UI4 | VarEnum.VT_ARRAY: return typeof(uint[]); case VarEnum.VT_I8 | VarEnum.VT_ARRAY: return typeof(long[]); case VarEnum.VT_UI8 | VarEnum.VT_ARRAY: return typeof(ulong[]); default: return Type.ILLEGAL_TYPE; } } internal static object MarshalPropertyValue(PropertyID propertyID, object input) { if (input == null) return (object)null; try { if (propertyID == Property.DATATYPE) return (object)(short)Interop.GetType((System.Type)input); if (propertyID == Property.ACCESSRIGHTS) { switch ((accessRights)input) { case accessRights.readable: return (object)1; case accessRights.writable: return (object)2; case accessRights.readWritable: return (object)3; default: return (object)null; } } else if (propertyID == Property.EUTYPE) { switch ((euType)input) { case euType.noEnum: return (object)OPCEUTYPE.OPC_NOENUM; case euType.analog: return (object)OPCEUTYPE.OPC_ANALOG; case euType.enumerated: return (object)OPCEUTYPE.OPC_ENUMERATED; default: return (object)null; } } else { if (propertyID == Property.QUALITY) return (object)((Quality)input).GetCode(); if (propertyID == Property.TIMESTAMP) { if (input.GetType() == typeof(DateTime)) { DateTime dateTime = (DateTime)input; return dateTime != DateTime.MinValue ? (object)dateTime.ToLocalTime() : (object)dateTime; } } } } catch { } return input; } internal static object UnmarshalPropertyValue(PropertyID propertyID, object input) { if (input == null) return (object)null; try { if (propertyID == Property.DATATYPE) return (object)Interop.GetType((VarEnum)System.Convert.ToUInt16(input)); if (propertyID == Property.ACCESSRIGHTS) { switch (System.Convert.ToInt32(input)) { case 1: return (object)accessRights.readable; case 2: return (object)accessRights.writable; case 3: return (object)accessRights.readWritable; default: return (object)null; } } else if (propertyID == Property.EUTYPE) { switch ((OPCEUTYPE)input) { case OPCEUTYPE.OPC_NOENUM: return (object)euType.noEnum; case OPCEUTYPE.OPC_ANALOG: return (object)euType.analog; case OPCEUTYPE.OPC_ENUMERATED: return (object)euType.enumerated; default: return (object)null; } } else { if (propertyID == Property.QUALITY) return (object)new Quality(System.Convert.ToInt16(input)); if (propertyID == Property.TIMESTAMP) { if (input.GetType() == typeof(DateTime)) { DateTime dateTime = (DateTime)input; return dateTime != DateTime.MinValue ? (object)dateTime.ToLocalTime() : (object)dateTime; } } } } catch { } return input; } }