Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
        }