/// <summary> /// Allocates and marshals an array of OPCBROWSEELEMENT structures. /// </summary> internal static IntPtr GetItemStates(TsCDaItemValueResult[] input) { IntPtr output = IntPtr.Zero; if (input != null && input.Length > 0) { output = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(OpcRcw.Da.OPCITEMSTATE)) * input.Length); IntPtr pos = output; for (int ii = 0; ii < input.Length; ii++) { OpcRcw.Da.OPCITEMSTATE item = new OpcRcw.Da.OPCITEMSTATE(); item.hClient = System.Convert.ToInt32(input[ii].ClientHandle); item.vDataValue = input[ii].Value; item.wQuality = (input[ii].QualitySpecified) ? input[ii].Quality.GetCode() : (short)0; item.ftTimeStamp = Convert(Technosoftware.DaAeHdaClient.Com.Interop.GetFILETIME(input[ii].Timestamp)); item.wReserved = 0; Marshal.StructureToPtr(item, pos, false); pos = (IntPtr)(pos.ToInt64() + Marshal.SizeOf(typeof(OpcRcw.Da.OPCITEMSTATE))); } } return(output); }
/// <summary> /// Unmarshals and deallocates a OPCITEMSTATE structures. /// </summary> internal static TsCDaItemValue[] GetItemValues(ref IntPtr pInput, int count, bool deallocate) { TsCDaItemValue[] output = null; if (pInput != IntPtr.Zero && count > 0) { output = new TsCDaItemValue[count]; IntPtr pos = pInput; for (int ii = 0; ii < count; ii++) { OpcRcw.Da.OPCITEMSTATE result = (OpcRcw.Da.OPCITEMSTATE)Marshal.PtrToStructure(pos, typeof(OpcRcw.Da.OPCITEMSTATE)); output[ii] = new TsCDaItemValue(); output[ii].ClientHandle = result.hClient; output[ii].Value = result.vDataValue; output[ii].Quality = new TsCDaQuality(result.wQuality); output[ii].QualitySpecified = true; output[ii].Timestamp = Technosoftware.DaAeHdaClient.Com.Interop.GetFILETIME(Convert(result.ftTimeStamp)); output[ii].TimestampSpecified = output[ii].Timestamp != DateTime.MinValue; if (deallocate) { Marshal.DestroyStructure(pos, typeof(OpcRcw.Da.OPCITEMSTATE)); } pos = (IntPtr)(pos.ToInt64() + Marshal.SizeOf(typeof(OpcRcw.Da.OPCITEMSTATE))); } if (deallocate) { Marshal.FreeCoTaskMem(pInput); pInput = IntPtr.Zero; } } return(output); }